我有三个选项卡的标签动作条/ viewpager布局说A,B和C。 在标签c标签(片段),我加入另一片段说片段d。 同
DFragment f= new DFragment();
ft.add(android.R.id.content, f, "");
ft.remove(CFragment.this);
ft.addToBackStack(null);
ft.commit();
我修改动作条在DFragment的的onResume加起来按钮:
ActionBar ab = getActivity().getActionBar();
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
ab.setDisplayHomeAsUpEnabled(true);
ab.setDisplayShowHomeEnabled(true);
现在DFragment,当我按下硬件(手机)后退按钮,我回到与CFragment原来的选项卡式(ABC)的布局选择。 我怎样才能实现与动作条上按钮此功能?
Answer 1:
实施OnBackStackChangedListener
这个代码添加到您的片段活动。
@Override
public void onCreate(Bundle savedInstanceState) {
//Listen for changes in the back stack
getSupportFragmentManager().addOnBackStackChangedListener(this);
//Handle when activity is recreated like on orientation Change
shouldDisplayHomeUp();
}
@Override
public void onBackStackChanged() {
shouldDisplayHomeUp();
}
public void shouldDisplayHomeUp(){
//Enable Up button only if there are entries in the back stack
boolean canGoBack = getSupportFragmentManager().getBackStackEntryCount()>0;
getSupportActionBar().setDisplayHomeAsUpEnabled(canGoBack);
}
@Override
public boolean onSupportNavigateUp() {
//This method is called when the up button is pressed. Just the pop back stack.
getSupportFragmentManager().popBackStack();
return true;
}
Answer 2:
我知道了。 只是重写onOptionsItemSelected在举办活动和弹出堆栈中,如
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
}
return true;
default:
return super.onOptionsItemSelected(item);;
}
}
呼叫getActionBar().setDisplayHomeAsUpEnabled(boolean);
和getActionBar().setHomeButtonEnabled(boolean);
在onBackStackChanged()
如下面的答案说明。
Answer 3:
如果你有一个父活动,并希望这件事按钮,后退按钮的工作,您可以使用此代码:
这在主活动类添加到的onCreate
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
int stackHeight = getSupportFragmentManager().getBackStackEntryCount();
if (stackHeight > 0) { // if we have something on the stack (doesn't include the current shown fragment)
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} else {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setHomeButtonEnabled(false);
}
}
});
然后添加onOptionsItemSelected像这样:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
getSupportFragmentManager().popBackStack();
return true;
....
}
我一般用这一切的时候,似乎很合法
Answer 4:
你可以回去与像后退按钮按钮;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
super.onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
Answer 5:
我知道这个问题是旧的,但可能是有人(像我)也需要它。
如果你的活动延伸AppCompatActivity,你可以用一个简单的(两步)解决方案:
1 - 无论何时添加非家庭片段只显示向上按钮,commiting片段交易之后。 像这样:
// ... add a fragment
// Commit the transaction
transaction.commit();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
2 - 然后,当按了按钮,隐藏它。
@Override
public boolean onSupportNavigateUp() {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
return true;
}
而已。
Answer 6:
我用的组合罗杰·加尔松涅托的和sohailaziz的答案。 我的应用程序有一个单一的MainActivity,和片段被加载到它的A,B,C。 我的“家”片段(A)实现OnBackStackChangedListener,并检查返回堆栈的大小; 如果是小于1,那么它隐藏UP键。 片段B和C总是加载后退按钮(在我的设计,B从A推出,和C向B发射)。 在MainActivity本身只是对持久性有机污染物UP按钮自来水返回堆栈,并且有方法来显示/隐藏按钮,该片段致电:
MainActivity:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
getSupportFragmentManager().popBackStack();
return true;
}
return super.onOptionsItemSelected(item);
}
public void showUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
public void hideUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); }
fragmentA(实现FragmentManager.OnBackStackChangedListener):
public void onCreate(Bundle savedinstanceSate) {
// listen to backstack changes
getActivity().getSupportFragmentManager().addOnBackStackChangedListener(this);
// other fragment init stuff
...
}
public void onBackStackChanged() {
// enable Up button only if there are entries on the backstack
if(getActivity().getSupportFragmentManager().getBackStackEntryCount() < 1) {
((MainActivity)getActivity()).hideUpButton();
}
}
fragmentB,fragmentC:
public void onCreate(Bundle savedinstanceSate) {
// show the UP button
((MainActivity)getActivity()).showUpButton();
// other fragment init stuff
...
}
Answer 7:
这为我工作。 覆盖onSupportNavigateUp和onBackPressed,例如(在科特林代码);
override fun onBackPressed() {
val count = supportFragmentManager.backStackEntryCount
if (count == 0) {
super.onBackPressed()
} else {
supportFragmentManager.popBackStack()
}
}
override fun onSupportNavigateUp(): Boolean {
super.onSupportNavigateUp()
onBackPressed()
return true
}
现在,在该片段中,如果显示的向上箭头
activity.supportActionBar?.setDisplayHomeAsUpEnabled(true)
点击它带你回到以前的活动。
Answer 8:
科特林:
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
supportFragmentManager.addOnBackStackChangedListener { setupHomeAsUp() }
setupHomeAsUp()
}
private fun setupHomeAsUp() {
val shouldShow = 0 < supportFragmentManager.backStackEntryCount
supportActionBar?.setDisplayHomeAsUpEnabled(shouldShow)
}
override fun onSupportNavigateUp(): Boolean =
supportFragmentManager.popBackStack().run { true }
...
}
Answer 9:
这是一个很好的和可靠的解决方案: http://vinsol.com/blog/2014/10/01/handling-back-button-press-inside-fragments/
的人取得了处理该backPress行为,并使用该策略图案活性片段之间进行切换的抽象片段。
对于一些你有可能在抽象类有点缺点......
不久,从链接的解决方案是这样的:
// Abstract Fragment handling the back presses
public abstract class BackHandledFragment extends Fragment {
protected BackHandlerInterface backHandlerInterface;
public abstract String getTagText();
public abstract boolean onBackPressed();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(!(getActivity() instanceof BackHandlerInterface)) {
throw new ClassCastException("Hosting activity must implement BackHandlerInterface");
} else {
backHandlerInterface = (BackHandlerInterface) getActivity();
}
}
@Override
public void onStart() {
super.onStart();
// Mark this fragment as the selected Fragment.
backHandlerInterface.setSelectedFragment(this);
}
public interface BackHandlerInterface {
public void setSelectedFragment(BackHandledFragment backHandledFragment);
}
}
在活动和使用情况:
// BASIC ACTIVITY CODE THAT LETS ITS FRAGMENT UTILIZE onBackPress EVENTS
// IN AN ADAPTIVE AND ORGANIZED PATTERN USING BackHandledFragment
public class TheActivity extends FragmentActivity implements BackHandlerInterface {
private BackHandledFragment selectedFragment;
@Override
public void onBackPressed() {
if(selectedFragment == null || !selectedFragment.onBackPressed()) {
// Selected fragment did not consume the back press event.
super.onBackPressed();
}
}
@Override
public void setSelectedFragment(BackHandledFragment selectedFragment) {
this.selectedFragment = selectedFragment;
}
}
文章来源: actionbar up navigation with fragments