web-dev-qa-db-ja.com

フラグメント内からアクティビティを開始するにはどうすればよいですか?

FragmentActivity内にタブのセットがあり、それぞれが独自のフラグメントを保持しています。そのフラグメント内からonClickListenerを介してstartActivity(myIntent)メソッドを使用して新しいアクティビティを開始しようとすると、アプリケーションの強制が終了します。

しばらく見て回った後、startActivityFromFragmentというメソッドへの参照を見つけましたが、1時間ほど検索した後、その使用方法の説明や例が見つかりません。私が使用すべきもの。

私が尋ねているのは、アクティビティから新しいアクティビティを起動することと、フラグメントから新しいアクティビティを起動することとの間に違いがあるかどうかであり、そうであれば、何を実装する必要がありますか?

53
user1617134

getActivity().startActivity(myIntent)で実行する必要があります

49
EkKoZ

私はそれをやりました、以下のコードは私のために働いています....

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

        Button newPage = (Button)v.findViewById(R.id.click);
        newPage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), HomeActivity.class);
                startActivity(intent);
            }
        });
        return v;
    }

そして、宛先アクティビティがManifest.xmlファイルに登録されていることを確認してください。

しかし、私の場合、すべてのタブがHomeActivityに表示されません。その解決策はありますか?

45
Jayesh

フラグメントからアクティビティを開始することとアクティビティを開始することの違いは、どちらの場合もアクティビティでなければならないため、コンテキストを取得する方法です。

アクティビティから:コンテキストは現在のアクティビティです(this

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

フラグメントから:コンテキストは親アクティビティです(getActivity())。フラグメント自体がstartActivity()を介してアクティビティを開始できることに注意してください。これはアクティビティから実行する必要はありません。

Intent intent = new Intent(getActivity(), NewActivity.class);
startActivity(intent);
11
David Dostal

複数のアクティビティに表示される(カスタム)メニューフラグメントからSendFreeTextActivityを起動するには、次のようにします。

MenuFragmentクラス内:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_menu, container, false);

    final Button sendFreeTextButton = (Button) view.findViewById(R.id.sendFreeTextButton);
    sendFreeTextButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Log.d(TAG, "sendFreeTextButton clicked");
            Intent intent = new Intent(getActivity(), SendFreeTextActivity.class);
            MenuFragment.this.startActivity(intent);
        }
    });
    ...
6
fadedbee

フラグメントが存在するアクティビティのベースコンテキストを使用して、インテントを開始します。

Intent j = new Intent(fBaseCtx, NewactivityName.class);         
startActivity(j);

ここで、fBaseCtxは現在のアクティビティのBaseContextです。 fBaseCtx = getBaseContext();として取得できます

1
user2766004