Android 在活动和片段中被压回
带碎片的导航抽屉。我在主要活动上放了一个片段。但如果我再按一下,同样的碎片会再次出现。我怎么处理这个?? 第二,如何在片段中实现onBackpressed?? 有人能帮我吗 在创建我的主要活动时Android 在活动和片段中被压回,android,android-fragments,android-activity,onbackpressed,Android,Android Fragments,Android Activity,Onbackpressed,带碎片的导航抽屉。我在主要活动上放了一个片段。但如果我再按一下,同样的碎片会再次出现。我怎么处理这个?? 第二,如何在片段中实现onBackpressed?? 有人能帮我吗 在创建我的主要活动时 FragmentTransaction tx = getFragmentManager().beginTransaction(); tx.replace(R.id.mainFrame, new PlaceOrderFragment()); tx.commit(); 而在背后的压
FragmentTransaction tx = getFragmentManager().beginTransaction();
tx.replace(R.id.mainFrame, new PlaceOrderFragment());
tx.commit();
而在背后的压力下,我有
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
用片段id替换onCreate中的ypu片段,然后在同一活动上实现onBackpressed,找到id为的片段,检查它是否可见或为null,然后基于它执行操作。
希望您能获得此信息。您可以使用界面来完成此操作。该接口将在每个片段中实现。下面是一个简单的例子:
FragmentTransaction tx = getFragmentManager().beginTransaction();
tx.replace(R.id.mainFrame, new PlaceOrderFragment()).addToBackStack("your tag");
tx.commit();
Override onBackPress() and try following code.
@Override
public void onBackPressed() {
int count = getFragmentManager().getBackStackEntryCount();
if (count == 0) {
super.onBackPressed();
//your other utility code if needed
} else {
getFragmentManager().popBackStack();
}
}
Hope this will work for you.
public interface OnBackPressedListener {
void onBackPressed();
}
在这里,如果您在片段中实现此接口,那么您将发现以下方法:
@Override
public void onBackPressed() {
getActivity().finish(); // Or Do your specific task
}
现在,保存该片段的活动应该使用onBackPressed()
回调。用该方法编写下面的代码
@Override
public void onBackPressed() {
if (YOUR_DRAWER.isDrawerOpen(GravityCompat.START)) {
YOUR_DRAWER.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer!
return;
}
Fragment fragment=getYourVisibleFragment();
if(fragment!=null){
((OnBackPressedListener)fragment).onBackPressed();
}else{
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
如果您想获得可见的片段,那么只需使用此方法
public <F extends Fragment> F getVisibleFragment() {
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
for (Fragment fragment : fragments) {
if (fragment != null && fragment.isVisible()) {
return (F) fragment;
}
}
}
return null;
}
公共F getVisibleFragment(){
List fragments=getSupportFragmentManager().getFragments();
if(片段!=null){
for(片段:片段){
if(fragment!=null&&fragment.isVisible()){
返回(F)片段;
}
}
}
返回null;
}
就是这样:)首先,您需要将fragmnet添加到后堆栈中,以便我们稍后在
onBackPressed()中检索它。
将fragmnet事务替换为此
FragmentTransaction tx = getFragmentManager().beginTransaction();
tx.replace(R.id.mainFrame, new PlaceOrderFragment());
// HERE WE WILL ADD FRAGMENT TO BACKSTACK SO WE COULD GET BACK TO IT
tx.addToBackStack(null);
tx.commit();
@Override
public void onBackPressed() {
// CHECKS HOW MANY FRAGMENTS ARE IN THE BACKSTACK
int count = getFragmentManager().getBackStackEntryCount();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
if (count == 0) {
// IF NO FRAGMENT IN THE BACKSTACK CALL
super.onBackPressed();
} else {
// GET THE LAST OPENED FRAGMENT
getFragmentManager().popBackStack();
}
}
}
将您的on backpressed
替换为此
FragmentTransaction tx = getFragmentManager().beginTransaction();
tx.replace(R.id.mainFrame, new PlaceOrderFragment());
// HERE WE WILL ADD FRAGMENT TO BACKSTACK SO WE COULD GET BACK TO IT
tx.addToBackStack(null);
tx.commit();
@Override
public void onBackPressed() {
// CHECKS HOW MANY FRAGMENTS ARE IN THE BACKSTACK
int count = getFragmentManager().getBackStackEntryCount();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
if (count == 0) {
// IF NO FRAGMENT IN THE BACKSTACK CALL
super.onBackPressed();
} else {
// GET THE LAST OPENED FRAGMENT
getFragmentManager().popBackStack();
}
}
}
在事务中,您是否尝试放置“addToBackstack()”?当您可以只添加到backstack时,为什么要这样做。如果您有多个片段,那么您需要一步一步地知道片段是否可用,以便您可以返回片段。我认为OP中没有提到该场景。这只是为了让您知道如何执行该操作