web-dev-qa-db-ja.com

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

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

私はフラグメントAにあり、ボタンをクリックするとフラグメント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();
}

Fragment-Bで戻るボタンをクリックすると、Fragment-Cに変わります。

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

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

Androidの戻るボタンのような現在のフラグメントを終了する方法は?

65
Wun

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

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

57
S.D.

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

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

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

103
Wun

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

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

49

これを試して:

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

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

4
Shylendra Madda

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

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

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

     btn_FragSP_back.setOnClickListener {
        activity.onBackPressed()
    }
}
3
Abdul Rehman

それは私のために働いているので、このロジックを試すことができます。

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();
}
2
user8595527
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();
    }
});
2
Bruno L.

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

2

これを試してください:

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();
}
2
None

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

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;
        }
    }
});
1
user6683868

これを試して

getActivity().finish();
0
Karan Chunara