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の戻るボタンのような現在のフラグメントを終了する方法は?
フラグメントAからBに移動するには、AをBに置き換え、addToBackstack()
の前にcommit()
を使用します。
フラグメントBから、Cに移動するには、最初にpopBackStackImmediate()
を使用します。これにより、Aが返されます。最初のトランザクションと同様に、AをCに置き換えます。
コードをgetActivity().getFragmentManager().beginTransaction().remove(this).commit();
から変更します
に
getActivity().getFragmentManager().popBackStack();
そして、それはフラグメントを閉じることができます。
簡単な方法を理解する必要がある人のために
getActivity().onBackPressed();
を試してください
これを試して:
ft.addToBackStack(null); // ft is FragmentTransaction
したがって、back-keyを押すと、現在のアクティビティ(複数のフラグメントを保持している)が終了するのではなく、前のフラグメントをロードします。
これはこれを行うKotlinの方法です。フラグメントレイアウトでボタンを作成し、onViewCreatedでonClickListnerを設定しました。
@ Viswanath-Lekshmananコメントによると
override fun onViewCreated(view: View?, savedInstanceState: Bundle?)
{
super.onViewCreated(view, savedInstanceState)
btn_FragSP_back.setOnClickListener {
activity.onBackPressed()
}
}
それは私のために働いているので、このロジックを試すことができます。
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();
}
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();
}
});
getActivity().onBackPressed
は必要なすべてを行います。親アクティビティでonBackPressedメソッドを自動的に呼び出します。
これを試してください:
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();
}
戻るボタンを使用してアクションをより具体的に処理する必要がある場合は、次の方法を使用できます。
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;
}
}
});
これを試して
getActivity().finish();