如何隐藏顶部 Fragment 中的 "Up button" 并在其他 Fragment 中显示?
How to hide the "Up button" in the top Fragment and show it in other Fragments?
在与蓝牙相关的应用程序中(带有 minSdkVersion="18"
)我有一个 MainActivity.java,显示以下 3 个之一 UI片段:
- MainFragment.java(顶屏)
- SettingsFragment.java(设置界面,通过菜单进入)
- ScanningFragment.java(列出附近的蓝牙设备)
要显示 "Up button" 并处理 "Back button" 我有以下代码:
public class MainActivity extends Activity
implements BleWrapperUiCallbacks {
// set in onResume() of each fragment
private Fragment mActiveFragment = null;
´ @Override
public void onBackPressed() {
if (!getFragmentManager().popBackStackImmediate())
super.onBackPressed();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_root);
getActionBar().setDisplayHomeAsUpEnabled(true);
if (savedInstanceState == null) {
Fragment fragment = new MainFragment();
getFragmentManager().beginTransaction()
.replace(R.id.root, fragment, "main")
.commit();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
getFragmentManager().popBackStackImmediate();
break;
case R.id.action_settings:
Fragment fragment = new SettingsFragment();
getFragmentManager().beginTransaction()
.addToBackStack(null)
.replace(R.id.root, fragment, "settings")
.commit();
break;
}
return super.onOptionsItemSelected(item);
}
这很好用,但有一个外观问题,即在显示 MainFragment.java 时仍然显示 "Up button" - 如您所见在上面屏幕截图的左侧。
我试过打电话给
getActionBar().setHomeButtonEnabled(false);
当该片段处于活动状态时,但这只会禁用 "Up button" - 而不会真正隐藏它。
你很幸运,因为在 API 级别 18 中有这个:
getActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);
对于支持库,它是:
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);
所以现在根据您所在的片段,您可以更改 "up" 按钮的图标。
另外,试试这个:
getActionBar().setDisplayHomeAsUpEnabled(false);
Set whether home should be displayed as an "up" affordance.
在 Little Child 的帮助下(谢谢!)我的解决方案使用 FragmentManager.OnBackStackChangedListener:
public class MainActivity extends Activity
implements OnBackStackChangedListener,
BleWrapperUiCallbacks {
@Override
public void onCreate(Bundle savedInstanceState) {
...
getFragmentManager().addOnBackStackChangedListener(this);
}
@Override
public void onBackStackChanged() {
getActionBar().setDisplayHomeAsUpEnabled(
getFragmentManager().getBackStackEntryCount() > 0);
}
2021 工作解决方案:
(requireActivity() as AppCompatActivity).supportActionBar?.setHomeAsUpIndicator(null)
在与蓝牙相关的应用程序中(带有 minSdkVersion="18"
)我有一个 MainActivity.java,显示以下 3 个之一 UI片段:
- MainFragment.java(顶屏)
- SettingsFragment.java(设置界面,通过菜单进入)
- ScanningFragment.java(列出附近的蓝牙设备)
要显示 "Up button" 并处理 "Back button" 我有以下代码:
public class MainActivity extends Activity
implements BleWrapperUiCallbacks {
// set in onResume() of each fragment
private Fragment mActiveFragment = null;
´ @Override
public void onBackPressed() {
if (!getFragmentManager().popBackStackImmediate())
super.onBackPressed();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_root);
getActionBar().setDisplayHomeAsUpEnabled(true);
if (savedInstanceState == null) {
Fragment fragment = new MainFragment();
getFragmentManager().beginTransaction()
.replace(R.id.root, fragment, "main")
.commit();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
getFragmentManager().popBackStackImmediate();
break;
case R.id.action_settings:
Fragment fragment = new SettingsFragment();
getFragmentManager().beginTransaction()
.addToBackStack(null)
.replace(R.id.root, fragment, "settings")
.commit();
break;
}
return super.onOptionsItemSelected(item);
}
这很好用,但有一个外观问题,即在显示 MainFragment.java 时仍然显示 "Up button" - 如您所见在上面屏幕截图的左侧。
我试过打电话给
getActionBar().setHomeButtonEnabled(false);
当该片段处于活动状态时,但这只会禁用 "Up button" - 而不会真正隐藏它。
你很幸运,因为在 API 级别 18 中有这个:
getActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);
对于支持库,它是:
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);
所以现在根据您所在的片段,您可以更改 "up" 按钮的图标。
另外,试试这个:
getActionBar().setDisplayHomeAsUpEnabled(false);
Set whether home should be displayed as an "up" affordance.
在 Little Child 的帮助下(谢谢!)我的解决方案使用 FragmentManager.OnBackStackChangedListener:
public class MainActivity extends Activity
implements OnBackStackChangedListener,
BleWrapperUiCallbacks {
@Override
public void onCreate(Bundle savedInstanceState) {
...
getFragmentManager().addOnBackStackChangedListener(this);
}
@Override
public void onBackStackChanged() {
getActionBar().setDisplayHomeAsUpEnabled(
getFragmentManager().getBackStackEntryCount() > 0);
}
2021 工作解决方案:
(requireActivity() as AppCompatActivity).supportActionBar?.setHomeAsUpIndicator(null)