戻るボタンのようにボタンを使用して現在のフラグメントを閉じる方法は?


85

Imagebuttonを使用して現在のフラグメントを閉じようとしました。

私はFragment-Aにいます。ボタンをクリックすると、Fragment-Bに変わります。

そして、Fragment-Bのボタンをクリックすると、Fragment-Cに変わり、Fragment-Bが閉じます。

Fragment-Cの戻るボタンをクリックすると、Fragment-Aに戻ります。

私が試したコードは次のようなものです

camera_album = (ImageButton) view.findViewById(R.id.camera_album);

camera_album.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {

                    closefragment();
        Fragment fragment = FileBrowserFragment.newInstance(null, null, null) ;
        MainActivity.addFragment(LocalFileBrowserFragment.this, fragment) ;


    }
});

private void closefragment() {
    getActivity().getFragmentManager().beginTransaction().remove(this).commit();
}

フラグメントBの戻るボタンをクリックすると、フラグメントCに変わります。

しかし、Fragment-Cの[戻る]ボタンをクリックしても、Fragment-Aに戻りません。空の背景に戻ります。Fragment-Aに戻りたい場合は、もう一度[戻る]ボタンをクリックする必要があります。

だから、現在のフラグメントを完全に閉じていないようです。

Androidの戻るボタンのように現在のフラグメントを終了するにはどうすればよいですか?


これは何MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)ですか??。フラグメントをバックスタックに追加し、それに応じて同じものをポップする必要があります
Raghunandan

関数addFragmentにフラグメントを追加しました。
ウン

何にフラグメントを追加し、アクティビティメソッド??
ラグナンダン

2
getActivity()。onBackPressed(); これを行うことができます
Viswanath Lekshmanan 2015年

回答:


81

フラグメントAからBに移動するには、AをBに置き換えて、addToBackstack()前に使用しcommit()ます。

フラグメントBからCに移動するには、最初にを使用するとpopBackStackImmediate()、Aが返されます。最初のトランザクションと同様に、AをCに置き換えます。


4
for usinf popStackImmediate():-> getView()。setOnKeyListener(new View.OnKeyListener(){@ Override public boolean onKey(View v、int keyCode、KeyEvent event){if(keyCode == KeyEvent.KEYCODE_BACK){getActivity() .getSupportFragmentManager()。popBackStackImmediate(); trueを返す;} falseを返す;}});
Yash Agrawal 2016

130

コードをから変更します getActivity().getFragmentManager().beginTransaction().remove(this).commit();

getActivity().getFragmentManager().popBackStack();

そして、それはフラグメントを閉じることができます。


35
getActivity()。onBackPressed(); これはあなたが説明したことをするでしょう。
Viswanath Lekshmanan 2015年

4
@ suomi35いいえ。onBackPressed()をオーバーライドする必要がある場合、そのような実現で問題が発生します
Le_Enot 2015

うまくいかないようです。2016年には、setNavigationOnClickListenerに機能しません。

1
@ViswanathLekshmananこれはコメントではなく答えであるべきだと思います。そして、さらに、受け入れられた答え。
フランシスコロメロ

1
アクティビティも終了します!フラグメントのクローズのみが必要です。
ゾン2018

70

簡単な方法を理解する必要がある人のために

試してみてください getActivity().onBackPressed();


getActivity()は多くの場合nullになる可能性があります。
ArpitJ.19年

1
@ArpitJ。onAttach()が呼び出される前はnullのみであり、フラグメントはアクティビティなしでは存続できません。
タミムアタフィ

@TamimAttafi Trueですが、ローテーションやアクティビティが終了し、何らかの理由でフラグメントインスタンスがまだ存在している場合は、nullを返します。
Arpit J.

popBackStack()そしてpopBackStackImmediate()、ボタンを押すをシミュレートすることなく、最上位のフラグメントを飛び出るのより直接的な方法です。onBackPressed()トリガーOnBackPressedCallbackの使用s; 将来、特に戻るボタンの押下を処理する場合は、プログラムでコールバックがトリガーされないように、popBackStack()/popBackStackImmediate()に切り替える必要があります。
ノーランエイミー

このコードは、フラグメントのボタンのonclickメソッド内に配置します。
アノン

6

getActivity().onBackPressed必要なことはすべて行います。親アクティビティのonBackPressedメソッドを自動的に呼び出します。


4

これを試して:

ft.addToBackStack(null);   // ft is FragmentTransaction

したがって、戻るキーを押すと、現在のアクティビティ(複数のフラグメントを保持)は、それ自体を終了するのではなく、前のフラグメントをロードします。


4

このロジックは私のために機能しているので、試すことができます。

frag_profile profile_fragment = new frag_profile();

boolean flag = false;
@SuppressLint("ResourceType")
public void profile_Frag(){
    if (flag == false) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.setCustomAnimations(R.anim.transition_anim0, R.anim.transition_anim1);
        transaction.replace(R.id.parentPanel, profile_fragment, "FirstFragment");
        transaction.commit();
        flag = true;
    }

}

@Override
public void onBackPressed() {
    if (flag == true) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.remove(profile_fragment);
        transaction.commit();
        flag = false;
    }
    else super.onBackPressed();
}

4

これはKotlinの方法です。フラグメントレイアウトでボタンを作成し、onViewCreatedでonClickListnerを設定しました。

@ Viswanath-Lekshmananのコメントによると

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) 
{
     super.onViewCreated(view, savedInstanceState)

     btn_FragSP_back.setOnClickListener {
        activity?.onBackPressed()
    }
}

これにより、フラグメントではなくアクティビティが終了します
nibbana

3

これを試して:

public void removeFragment(Fragment fragment){
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.remove(fragment);
    fragmentTransaction.commit();
}

3
Button ok= view.findViewById(R.id.btSettingOK);
Fragment me=this;
ok.setOnClickListener( new View.OnClickListener(){
    public void onClick(View v){
     getActivity().getFragmentManager().beginTransaction().remove(me).commit();
    }
});

3
このコードは質問に答えることができますが、このコードが質問に答える理由や方法に関する追加のコンテキストを提供すると、長期的な価値が向上します。
rollstuhlfahrer 2018

この単純なコードは、実際には、現在のフラグメントビューを[OK]または[閉じる]ボタンで削除します。フラグメントとして表示されているライト設定パネルを終了して、アクティビティに戻るために使用します。このトリックで申し訳ありませんが、Android 8では、複数のフラグメントを管理することはそれほど実用的ではないと思います。
ブルーノ

1

戻るボタンを使用してアクションをより具体的に処理する必要がある場合は、次の方法を使用できます。

view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            onCloseFragment();
            return true;
        } else {
            return false;
        }
    }
});

0

フラグメントでonCreateView(...)、を呼び出すことでビューを削除できますcontainer.removeView(view);。したがって、フラグメントを削除するview場合はonCreateView、の戻り値である必要があります。

例えば

    public View onCreateView(...){
        final View view = inflater.inflate(R.layout.your_fragments_layout,container,false);
        //Do something
        finishButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                container.removeView(view);
            }
        });
        return view;
    }

-7

これを試してください

getActivity().finish();

1
OPや他の人々が将来この質問に戻ってくる答えを理解しやすいように、あなたの答えをもっと説明してみてください
Aman Chhabra 2018

7
これにより、フラグメントではなく、アクティビティ全体が終了します
busuu 2018

それは私を助けました。より多くの情報が欲しい人はそれをグーグルするかもしれません。ここに公式ドキュメントをコピーして貼り付ける必要はありません。
alesha1 7019

通常1つのアクティビティがあるBottomNavigationViewを使用している場合、このコマンドは前のフラグメントに戻る代わりにアプリを閉じます。
アリトンオリベイラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.