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


91

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)

3
おそらく、FragmentActivityを拡張するのではなく、Fragmentを拡張する必要がありますか?
2013年

1
ええと、あなたが使っていない人のためにFragments。投稿したコードには少なくともありません。
アドニール2013年

回答:


247

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

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

更新

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

public class mFragmentFavorite extends FragmentActivity{

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

public class mFragmentFavorite extends Fragment {

さて、最初の投稿でコードを更新します。しかし、私はmContextReferenceを完全には理解していません。私が持っているものとより良い名前でコードを更新します、私に5分を与えます
mXX 2013年

これは、Fragmentまたはへの参照の例ですActivity。これらのクラスのmContextReferenceいずれかの内部でコードを使用している場合は、1行目と2行目のgetActivity()forFragmentまたはthisforのいずれかに置き換えることができます。より明確にするために答えを更新します。Activitythis
Michael Celey 2013年

さて、私はあなたが私に与えたより良い名前とアドバイスで質問を更新しました。私はそれを機能させるためにあなたの提案を実装しようとします。助けてくれてありがとう
mXX 2013年

ええ、私はそれをフラグメントに戻しましたが、IDを見つけるためにbtnでエラーが発生します「メソッドfindViewById(int)はタイプFavoriteActivityに対して未定義です」
mXX 2013年

2
作成する場合はFragment、に変更findViewByIdv.findViewByIdます。にはfindViewById関数がないFragmentので、getView最初に呼び出してからそれを呼び出す必要がありますfindViewById。ただし、あなたの場合は、すでにビューがonCreateViewあり、それが変数になりますv
Michael Celey 2013年

21

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

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

また、クラスMFragmentActivitymFragmentActivity。ではなくcaps:を付けて名前を付ける必要があります。


4

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

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

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

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

アクティビティ、サービス、およびアプリケーションはContextWrapperクラスを拡張するため、最初の引数の代わりにthisまたはgetContext()またはgetApplicationContext()を使用できます。


「getActivity()を使用している場合は、呼び出し元のアクティビティがすでに追加されていることを確認する必要があります。」-この行は初心者にとってどのような意味がありますか?
パラクジャイン

@PalakJainつまり、アクティビティの状態(Active to Destroyed)は、xの理由に応じて変化し続けます。アクティビティに対して何かを実行するときは、アクティビティがアクティブ状態になっている必要があります。onResumeとonPauseの間にライフがある場合、アクティビティはアクティブ状態です。
ジャヤクリシュナン

まあ、それは理にかなっています。ありがとう!
パラクジャイン

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

0

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


0

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

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

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

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

0

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

requireContext().startActivity<YourTargetActivity>()


私はこのコードをしようとすると、私が得る:None of the following functions can be called with the arguments supplied. startActivity(Intent!) defined in android.content.Context startActivity(Intent!, Bundle?) defined in android.content.Context
ティム・

あなたはおそらく必要があります@Tim AndroidのKTXを仕事にコードのために。
Edric
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.