99

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;
    }
}

お気に入りの科目

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);、エラーは次のようになります。

メソッドfindViewById(int)は、FavoriteActivityタイプに対して未定義です。

編集:

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

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)
4

7 に答える 7

271

mFragmentFavoriteあなたのコードには、FragmentActivityと同じものではないがありFragmentます。これが、タイプの不一致が発生する理由です。また、それを開始する適切な方法ではないため、new決して呼び出すべきではありません。Activity

の新しいインスタンスを開始する場合は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に変更する必要があります。

アップデート

また、の使用に基づくのではなく、実際に意図されmFragmentFavoriteているように見えます。になりたい場合は、次のコード行を変更してください。FragmentFragmentActivityonCreateViewmFragmentFavoriteFragment

public class mFragmentFavorite extends FragmentActivity{

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

public class mFragmentFavorite extends Fragment {
于 2013-03-18T13:41:39.043 に答える
24

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

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

MFragmentActivityまた、クラスに.の代わりにcaps:を使用して名前を付ける必要がありますmFragmentActivity

于 2013-03-18T13:50:23.147 に答える
5

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

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

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

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

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

于 2016-11-28T15:10:04.913 に答える
3

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

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;
}
于 2014-04-07T08:31:31.630 に答える
1

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

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

アクティビティから新しいアクティビティを開始します。

Intent intent = new Intent(this, TargetActivity.class);
startActivity(intent);
于 2018-10-24T06:12:26.627 に答える
0

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

于 2018-07-30T03:28:14.133 に答える
0

Kotlinを使用して、次のコードを実行します。

requireContext().startActivity<YourTargetActivity>()

于 2019-06-19T12:48:46.100 に答える