我在片段中的后退/向上按钮有问题。 我有一个活动,其中我有一些片段。在一个片段中,我称之为“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();
非常感谢: - )
答案 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);
}