web-dev-qa-db-ja.com

フラグメントからアクティビティを開始する

両方のフラグメントにボタンがある2つのフラグメントがあります。ボタンを押すと、新しいアクティビティを開始したいです。しかし、私はそれを機能させることができません。

私が得ているエラー:ここでのエラー:型の不一致:mFragmentFavoriteからFragmentに変換できません

何が間違っていますか?

MyFragmentPagerAdapter

import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentManager;
import Android.support.v4.app.FragmentPagerAdapter;

public class MyFragmentPagerAdapter extends FragmentPagerAdapter{

    final int PAGE_COUNT = 3;

    /** Constructor of the class */
    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    /** This method will be invoked when a page is requested to create */
    @Override
    public Fragment getItem(int arg0) {

        switch(arg0){

        case 0:
            return new FavoriteActivity();
                    //ERROR: Type mismatch: cannot convert from FavoriteActivity to Fragment


        case 1:
            return new SettingsActivity();


        default:
            return null;

        }       
    }

    /** Returns the number of pages */
    @Override
    public int getCount() {
        return PAGE_COUNT;
    }
}

FavoriteActivity

import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.view.ViewGroup;
import Android.widget.Button;

public class FavoriteActivity extends Activity{

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.main_favorite, container, false);


        OnClickListener listnr=new OnClickListener() {
            @Override
            public void onClick(View v) {
                  Intent i= new Intent("aFavorite");
                  startActivity(i);
            }
        };

          Button btn =(Button) v.findViewById(R.id.mainFavorite);
          btn.setOnClickListener(listnr);

          return v;
    }
}

FavoriteActivityがフラグメントを拡張する場合、エラーはなくなりますが、その後findViewById(R.id.mainFavorite);でエラーが発生し、エラーは

メソッドFavoriteViewById(int)は、FavoriteActivityタイプでは未定義です

編集:

フラグメントのボタンを押してアクティビティを開始すると、アプリがクラッシュしますこれが私のlogcatです

03-18 16:01:23.985: E/AndroidRuntime(1985): FATAL EXCEPTION: main
03-18 16:01:23.985: E/AndroidRuntime(1985): Android.content.ActivityNotFoundException: No Activity found to handle Intent { act=FavoriteActivityList }
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.app.Instrumentation.checkStartActivityResult(Instrumentation.Java:1569)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1420)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.app.Activity.startActivityForResult(Activity.Java:3446)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.app.Activity.startActivityForResult(Activity.Java:3407)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.Java:826)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.support.v4.app.Fragment.startActivity(Fragment.Java:838)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at com.example.spui.FavoriteActivity$1.onClick(FavoriteActivity.Java:24)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.view.View.performClick(View.Java:4211)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.view.View$PerformClick.run(View.Java:17267)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.os.Handler.handleCallback(Handler.Java:615)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.os.Handler.dispatchMessage(Handler.Java:92)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.os.Looper.loop(Looper.Java:137)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Android.app.ActivityThread.main(ActivityThread.Java:4898)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Java.lang.reflect.Method.invokeNative(Native Method)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at Java.lang.reflect.Method.invoke(Method.Java:511)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1006)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:773)
03-18 16:01:23.985: E/AndroidRuntime(1985):     at dalvik.system.NativeStart.main(Native Method)
74
mXX

コード内のmFragmentFavoriteFragmentActivityであり、Fragmentとは異なります。そのため、型の不一致が発生します。また、newActivityを呼び出すことは、それを開始する適切な方法ではないため、絶対に呼び出さないでください。

mFragmentFavoriteの新しいインスタンスを開始する場合は、Intentを使用して開始できます。

Fragmentから:

Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);

Activityから

Intent intent = new Intent(this, mFragmentFavorite.class);
startActivity(intent);

aFavoriteの代わりにmFragmentFavoriteを開始する場合は、作成されたIntentの名前を変更するだけです。

また、クラス名をより正確に変更することをお勧めします。 mFragmentFavoriteを呼び出すことは、Fragmentではないという点で不適切です。また、Javaのクラス宣言は通常、大文字で始まります。クラスの名前をFavoriteActivityのようにすると、より正確になり、言語規則に準拠することができます。 Javaではクラス名がファイル名と一致する必要があるため、これを選択した場合は、ファイルの名前をFavoriteActivity.Javaに変更する必要があります。

UPDATE

また、mFragmentFavoriteの使用に基づいて、実際にforFragmentFragmentActivityではなくonCreateViewであることを意図しているように見えます。 mFragmentFavoriteFragmentにする場合は、次のコード行を変更します。

public class mFragmentFavorite extends FragmentActivity{

代わりにこれを読んでください:

public class mFragmentFavorite extends Fragment {
209
Michael Celey

getActivity()を使用して、フラグメントからアクティビティを起動する必要があります

Intent intent = new Intent(getActivity(), mFragmentFavorite.class);
startActivity(intent);

また、MFragmentActivityではなく、mFragmentActivityのように大文字でクラスに名前を付ける必要があります。

20
liarspocker

これをフラグメントで使用します。

Button btn1 = (Button) thisLayout
            .findViewById(R.id.btnDb1);

    btn1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(getActivity(), otherActivity.class);
            ((MainActivity) getActivity()).startActivity(intent);

        }
    });

    return thisLayout;
}
3
Sara Zakizadeh

getActivity()を使用している場合、呼び出しアクティビティがaddedであることを確認する必要があります。そのような場合にアクティビティが追加されていないため、getActivity()を呼び出したときにnullを取得できます

そのような場合getContext()は安全です

アクティビティを開始するためのコードは、次のようにわずかに変更されます。

Intent intent = new Intent(getContext(), mFragmentFavorite.class);
startActivity(intent);

Activity、Service、およびApplicationはContextWrapperクラスを拡張するため、thisまたはgetContext()またはgetApplicationContext()を使用できます=最初の引数の場所

3
Jayakrishnan PM

フラグメントから新しいアクティビティを開始:

Intent intent = new Intent(getActivity(), TargetActivity.class);
startActivity(intent);

アクティビティから新しいアクティビティを開始:

Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
0
Abhay Bhusari

これに問題がある場合は、getActivity()をMainActivity.thisに置き換える必要があります。

0
ADL

kotlinでこのコードを実行します:

requireContext().startActivity<YourTargetActivity>()

0