フラグメントから現在のアクティビティを終了する


96

ナビゲーションドロワーとして使用しているアクティビティにフラグメントがあります。これには、クリックすると新しいアクティビティを開始するボタンが含まれます(フラグメントのstartActivityは、現在のアクティビティのstartActivityを呼び出すだけです)。

私の人生では、新しいアクティビティを開始した後、現在のアクティビティをどのように終了するのかわからないようです。

私はフラグメントでこのようなことを達成しようとしています:

@Override
public void onClick(View view) {
    // TODO Auto-generated method stub
    if (view == mButtonShows) {
        Intent intent = new Intent(view.getContext(), MyNewActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        finish();
    } 
}

しかし、Fragment.classはfinish()を実装していないようです(startActivity(...)を実装しているように)。

2番目のアクティビティを起動したときに、アクティビティのバックスタックをクリアしてください。(したがって、新しいアクティビティから戻ると、技術的にはランチャーに戻されます)

回答:


277

フラグメントを使用するthis場合、コンテキストを使用または参照する代わりに、常にを使用しますgetActivity()。あなたは電話する必要があります

getActivity().finish();

フラグメントからアクティビティを終了します。


12
getActivity()することができnull、いくつかのケースで。次に何をすべきか?
Matjaz Kristl 2012年

3
@ user983956このような場合、アクティビティはすでに破棄されているので、を呼び出さないでくださいfinish
クリスティアン

2
ヒントとして:ビューを
拡張

1
アクティビティはフラグメントではなくコントローラー/インチャージである必要があります。コールバックインターフェースを介してアクティビティをコールバックし、アクティビティがそれ自体を終了するかどうかを決定させる必要があります。
アーメド

1
また、アクティビティにシングルトンが挿入されている場合は、それらを破棄することを忘れないでください。メモリリークが発生するか、コールバックがある場合は削除されます。、if(getActivity()!= null){getActivity()。removeCallbacks(); getActivity()。destroy(); }
omersem

26

えっと…

フラグメントにアクティビティを完了させようとはしません。それは私の意見ではフラグメントにあまりにも多くの権限を置きます。代わりに、ここでガイドを使用します。http//developer.android.com/training/basics/fragments/communicating.html

アクティビティに実装する必要があるインターフェースをフラグメントに定義させます。アクティビティに電話をかけ、アクティビティで情報の処理方法を決定します。アクティビティが終了したい場合は、終了できます。


2
1つのアクティビティで複数のフラグメントが存在する可能性があるため、これは良い点です。あなたが言うように、フラグメントがそのアクティビティに通信するための好ましい方法は、インターフェースを経由することです。
サスクワッチ2014年

11

Jon F Hancockが述べたように、これは、フラグメントがアクティビティを閉じるように提案することで、アクティビティを「閉じる」ことができる方法です。これにより、フラグメントが移植可能になります。別のアクティビティで使用する場合は、アクティビティを閉じたくない場合があります。

以下のコードは、保存とキャンセルのボタンがあるアクティビティとフラグメントのスニペットです。

PlayerActivity

public class PlayerActivity extends Activity 
    implements PlayerInfo.PlayerAddListener {

    public void onPlayerCancel() {
       // Decide if its suitable to close the activity, 
       //e.g. is an edit being done in one of the other fragments?
       finish();
    }
}

PlayerInfoFragment。呼び出し側のアクティビティが実装する必要のあるインターフェースが含まれています。

public class PlayerInfoFragment extends Fragment {
   private PlayerAddListener callback; // implemented in the Activity

   @Override
   public void onAttach(Activity activity) {
     super.onAttach(activity);
     callback= (PlayerAddListener) activity;
   }

   public interface PlayerAddListener {
       public void onPlayerSave(Player p); // not shown in impl above
       public void onPlayerCancel();
   }

   public void btnCancel(View v) {
      callback.onPlayerCancel(); // the activity's implementation
   }
}

1

finishを使用してフラグメントを閉じるたびに、アクティビティ全体が閉じます。ドキュメントによると、親アクティビティが残っている限り、フラグメントは残るはずです。

代わりに、次のステートメントを使用して親アクティビティにビューを変更できることがわかりました。setContentView(R.layout.activity_main);

これにより、親アクティビティに戻ります。

これがこれを探している他の誰かを助けることを願っています。


1

とてもシンプル...

1- getActivity()フラグメント内でアクティビティを取得する

2-次に電話する finish();

したがってgetActivity().finish();、親アクティビティを終了します。


1

フラグメントからアクティビティを完了するには、getActivity()メソッドを使用する必要があります。

getActivity().finish();

1

フラグメントではgetActivity.finishAffinity()を使用します

getActivity().finishAffinity();

また、現在のアクティビティによってプッシュされたすべてのフラグメントを、アクティビティのあるスタックからも削除します...


finishAffinity()は、同じアフィニティーを持つすべてのアクティビティーを削除するため、スタック内のフラグメントを含む現在のアクティビティーより下のアクティビティーも終了できます。
Zakaria M. Jawas

0

これを試して。警告はありません...

            Activity thisActivity = getActivity();
            if (thisActivity != null) {
                startActivity(new Intent(thisActivity, yourActivity.class)); // if needed
                thisActivity.finish();
            }

0

2020年6月15日-回答を更新。

JavaとKotlinには2つのオプションがあります。ただし、両方の方法のロジックは同じです。finish()メソッドを呼び出した後でアクティビティを呼び出す必要があります。

コトリンへの回答

アクティビティをnullにできない場合は、Answer_1を使用してください。ただし、アクティビティがnullなる可能性がある場合は、Answer_2を使用してください

Answer_1: activity!!.finish()
Answer_2: activity?.finish()

Javaの答え、

getActivity().finish();

@canerkaseler


-1

これを使ってみてください

はいFragment.class、実装していませんfinish()

フラグメントを使用する場合は、これを使用したり、コンテキストを参照したりする代わりに、常にを使用してくださいgetActivity()。あなたは電話する必要があります


11
あなたの答えと上の最初の答えの違いを教えてください(@ coder_For_Life22)...
Filipe Brito

その罠を
解い
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.