片段和后退按钮

时间:2016-09-13 20:40:14

标签: android android-fragments android-activity back

我在片段中的后退/向上按钮有问题。 我有一个活动,其中我有一些片段。在一个片段中,我称之为“1”,我有一个列表视图。当我点击任何项目时,它会转到另一个片段“2”。 我需要这样的功能,即后退/上移按钮仅适用于片段2,但不适用于片段1。

有没有办法可以做到这一点? 我在活动中试过这个,但我不明白这有什么帮助:

@Override
public void onBackPressed() {

    int count = getFragmentManager().getBackStackEntryCount();

    if (count == 0) {
        super.onBackPressed();
        //additional code
    } else {
        getFragmentManager().popBackStack();
    }

}

当我从片段1更改为片段2时,我有以下代码:

  fragment = new MaterialesFragment();
  FragmentManager fragmentManager3 = getFragmentManager();
  fragmentManager3.beginTransaction().replace(R.id.frame, fragment).addToBackStack("tagMateriales").commit();

非常感谢: - )

5 个答案:

答案 0 :(得分:0)

尝试在用于将fragment2替换为屏幕的addToBackStack()对象上使用FragmentTransaction方法:

fragmentManager.beginTransaction().replace(R.id.content_frame,fragment2).addToBackStack("tagHere").commit();

如果您不需要实际标记,则可以将null作为参数传递。

答案 1 :(得分:0)

请将此代码用于“片段2”

upgradeItems

其中public void showFragmentWithoutStack(Fragment fragment, String tag, int id) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); transaction.add(id, fragment, tag); transaction.commitAllowingStateLoss(); } 可能是String类名,活动中根视图的id(因为片段应出现在顶层)。

答案 2 :(得分:0)

为了在问题中使用Activity中的onBackPressed()方法覆盖,您还需要将其添加到Fragment中:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
      case android.R.id.home:
        // Assuming MainActivity is the Activity subclass name
        if (getActivity() instanceof MainActivity) {
            ((MainActivity) getActivity()).onBackPressed();
        }
        return true;
      default:
        return super.onOptionsItemSelected(item);
    }
}

要显示/隐藏后退按钮,请将这些方法添加到您的活动中:

public void showUpButton() {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

public void hideUpButton() {
    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}

然后,当您想要显示或隐藏片段中的后退/上移按钮时,请调用这些方法。

在您的情况下,您可以隐藏片段1中onResume()的后退/上移按钮:

((MainActivity) getActivity()).hideUpButton();

然后在片段2中的onResume()中显示:

((MainActivity) getActivity()).showUpButton();

答案 3 :(得分:0)

有很多方法可以完成这项工作。在我看来,最优雅的是以下。我会在每个组件中隔离逻辑。每个片段都实现了一个类似“IBackHandler”的接口,允许活动和片段进行通信。在活动onBackPressed中首先询问片段(如果它被实例化)该做什么然后行动。

界面:

public interface IBackHandler {
    boolean doBack();
}

实现该接口并将其逻辑用于处理后退按钮的片段:

public class YourFragment1 extends YourBaseFragment implements IBackHandler {
      // your code
      @Override
      public boolean doBack() {
           // return true means that you have done your stuff
           //and you don't want 'super.onBackPressed()' to be called
           return true; // this means do nothing
      }
 }

片段2:

 public class YourFragment2 extends YourBaseFragment implements IBackHandler {
      // your code
      @Override
      public boolean doBack() {
           return false; //this means: call 'super.onBackPressed()'
      }
 }

您的活动:

public class YourActivity extends YourBaseActivity {
     //your code
     @Override
     public void onBackPressed() {
         Fragment currentFragment = getFragmentManager().findFragmentById(R.id.yourFragment);
    if (currentFragment instanceof IBackHandler) {
        if (!((IBackHandler) currentFragment).doBack()) {
            super.onBackPressed();
        }
    } else
        super.onBackPressed();
     }
}

你可能认为这是过度工程,但我可以向你保证,通过这种方式,你将始终能够控制你流程中的任何内容。

希望这有帮助!

答案 4 :(得分:0)

我解决了这个问题,在更改片段时使用此代码:

String fragmentIndexString="fragmenttwo";//or fragmentone something
transaction.addToBackStack();

这是活动中的完整代码:

FirstFragment firstFragment; // my first fragment
SecondFragment secondFragment; // my second fragment
public static String FIRST="asfasgasg"; //first fragment index
public static String SECOND="gsadgsagd"; //second fragment index
...
/* u can change fragment by using setFragment funiction */
public void setFragment(String page){
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    switch (page){
        case FIRST:
            if(firstFragment==null) firstFragment= SettingFragment.newInstance();
            if (!firstFragment.isAdded()) {
                transaction.replace(R.id.fragmentcontainer, firstFragment);
                transaction.addToBackStack(INDEX);
                transaction.commit();
            } else {
                transaction.show(firstFragment);
            }
            break;
        case SECOND:
            if(secondFragment==null) secondFragment= SettingFragment.newInstance();
            if (!secondFragment.isAdded()) {
                transaction.replace(R.id.fragmentcontainer, secondFragment);
                transaction.addToBackStack(INDEX);
                transaction.commit();
            } else {
                transaction.show(secondFragment);
            }
            break;
        default:
            setFragment(INDEX);
    }
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
        if(fragmentManager.getBackStackEntryCount()>1){
            fragmentManager.popBackStack();
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}
相关问题