Android-将ActionBar返回按钮切换到导航按钮
我有以下问题: 我知道如何设置工具栏以显示后退按钮图标而不是汉堡按钮图标。Android-将ActionBar返回按钮切换到导航按钮,android,android-actionbar,navigation-drawer,android-toolbar,back-button,Android,Android Actionbar,Navigation Drawer,Android Toolbar,Back Button,我有以下问题: 我知道如何设置工具栏以显示后退按钮图标而不是汉堡按钮图标。 由此: 为此: 使用:getSupportActionBar().setDisplayHomeAsUpEnabled(true) 现在,我想做相反的动作,我想从后退按钮图标转到汉堡图标: 到这里: 我该怎么做 更新: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt
由此:
为此: 使用:
getSupportActionBar().setDisplayHomeAsUpEnabled(true)代码>
现在,我想做相反的动作,我想从后退按钮图标转到汉堡图标:
到这里:
我该怎么做
更新:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
}
private void enableViews(boolean enable) {
if(enable) {
// Enables back button icon
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} else {
// TODO: Enables burger icon
}
}
您可以使用以下命令更改操作栏按钮:
getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_button);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
用这个
getSupportActionBar().setDisplayShowHomeEnabled(true);
final Toolbar=(Toolbar)findviewbyd(R.id.actionbar);
setTitle(Html.fromHtml(“+getString(R.string.print_)+”);
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.menu_图标));
toolbar.setNavigationOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
DetailActivity.this.finish();
}
});
工具栏.inflateMenu(R.menu.fav);
toolbar.setOnMenuItemClickListener(新建toolbar.OnMenuItemClickListener()){
@凌驾
公共布尔onMenuItemClick(菜单项){
item.setIcon(右侧可绘制的背面图标)
返回true;
}
返回false;
}
});
尝试在活动的主题/样式中添加以下样式的代码AppTheme
。xml
它将使您的汉堡图标
变为带有动画的后退图标
条件如果您将汉堡图标与NavigationDrawer
和AppCompatActivity/ActionBarActivity
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="windowActionBar">false</item>
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style>
<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
<item name="spinBars">true</item>
<item name="color">@android:color/white</item>
</style>
假的
@样式/抽屉箭头样式
真的
@android:彩色/白色
我希望有帮助!或者你只需要用drawable就可以了
检查此项如果我假设您在布局中使用的是android.support.v4.widget.DrawerLayout
,则此方法可能适合您;我只在API21
上进行了测试,但考虑到它主要使用支持库,它应该在较低或较高的目标上工作(著名的最后一句话)
import android.support.v7.app.ActionBarDrawerToggle
import android.support.v4.widget.DrawerLayout
ActionBarDrawerToggle mDrawerToggle;
DrawerLayout drawerLayout;
private boolean mToolBarNavigationListenerIsRegistered = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
// Get DrawerLayout ref from layout
drawerLayout = (DrawerLayout)findViewById(R.id.drawer);
// Initialize ActionBarDrawerToggle, which will control toggle of hamburger.
// You set the values of R.string.open and R.string.close accordingly.
// Also, you can implement drawer toggle listener if you want.
mDrawerToggle = new ActionBarDrawerToggle (this, drawerLayout, mToolbar, R.string.open, R.string.close);
// Setting the actionbarToggle to drawer layout
drawerLayout.addDrawerListener(mDrawerToggle);
// Calling sync state is necessary to show your hamburger icon...
// or so I hear. Doesn't hurt including it even if you find it works
// without it on your test device(s)
mDrawerToggle.syncState();
}
/**
* To be semantically or contextually correct, maybe change the name
* and signature of this function to something like:
*
* private void showBackButton(boolean show)
* Just a suggestion.
*/
private void enableViews(boolean enable) {
// To keep states of ActionBar and ActionBarDrawerToggle synchronized,
// when you enable on one, you disable on the other.
// And as you may notice, the order for this operation is disable first, then enable - VERY VERY IMPORTANT.
if(enable) {
//You may not want to open the drawer on swipe from the left in this case
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
// Remove hamburger
mDrawerToggle.setDrawerIndicatorEnabled(false);
// Show back button
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// when DrawerToggle is disabled i.e. setDrawerIndicatorEnabled(false), navigation icon
// clicks are disabled i.e. the UP button will not work.
// We need to add a listener, as in below, so DrawerToggle will forward
// click events to this listener.
if(!mToolBarNavigationListenerIsRegistered) {
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Doesn't have to be onBackPressed
onBackPressed();
}
});
mToolBarNavigationListenerIsRegistered = true;
}
} else {
//You must regain the power of swipe for the drawer.
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
// Remove back button
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
// Show hamburger
mDrawerToggle.setDrawerIndicatorEnabled(true);
// Remove the/any drawer toggle listener
mDrawerToggle.setToolbarNavigationClickListener(null);
mToolBarNavigationListenerIsRegistered = false;
}
// So, one may think "Hmm why not simplify to:
// .....
// getSupportActionBar().setDisplayHomeAsUpEnabled(enable);
// mDrawer.setDrawerIndicatorEnabled(!enable);
// ......
// To re-iterate, the order in which you enable and disable views IS important #dontSimplify.
}
该解决方案使用ActionBarDrawerToggle.setDrawerIndicatorEnabled
切换汉堡图标的可见性,并使用ActionBar.setDisplayHomeAsUpEnabled
切换向上按钮的可见性,基本上利用了它们各自的可绘制资源
其他假设
- 您的活动主题扩展了
theme.AppCompat.Light.NoActionBar
我在中找到了灵活的解决方案
所以用法非常简单
setToolbarAsUp(new View.OnClickListener() {
@Override
public void onClick(View v) {
// onBackPressed();
// or navigate to parent or some other intent
}
});
对我来说,当我使用导航抽屉时,我想通过片段
操作栏左侧的后箭头图标更改汉堡图标。还在右侧添加菜单
在Main活动中,它已经设置好了-默认情况下,当Android Studio为我创建导航抽屉时-如下所示:
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
问题是如何自定义片段中的操作栏
,因此当我转到片段
时,它将显示自定义的操作栏
,当单击后退箭头图标时,它将离开片段,而操作栏
应返回到第一个状态
在片段中(完整实现):
fragment\u actionbar.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_horizontal" >
<ImageView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:src="@drawable/ic_menu_back"
android:layout_marginLeft="@dimen/_5sdp"
android:layout_alignParentStart="true"
android:layout_marginStart="@dimen/_5sdp" />
</RelativeLayout>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="459"
android:viewportWidth="459">
<path
android:fillColor="#ffffff"
android:pathData="M178.5,140.25v-102L0,216.75l178.5,178.5V290.7c127.5,0,216.75,40.8,280.5,130.05C433.5,293.25,357,165.75,178.5,140.25z"/>
</vector>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/border_shadow">
<item
android:id="@+id/option1"
android:title="@string/show_profile"
app:showAsAction="never"/>
<item
android:id="@+id/option2"
android:title="@string/report_pic"
app:showAsAction="never"/>
<item
android:id="@+id/option3"
android:title="@string/delete_pic"
app:showAsAction="never"/>
</menu>
ic\u menu\u back.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_horizontal" >
<ImageView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:src="@drawable/ic_menu_back"
android:layout_marginLeft="@dimen/_5sdp"
android:layout_alignParentStart="true"
android:layout_marginStart="@dimen/_5sdp" />
</RelativeLayout>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="459"
android:viewportWidth="459">
<path
android:fillColor="#ffffff"
android:pathData="M178.5,140.25v-102L0,216.75l178.5,178.5V290.7c127.5,0,216.75,40.8,280.5,130.05C433.5,293.25,357,165.75,178.5,140.25z"/>
</vector>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/border_shadow">
<item
android:id="@+id/option1"
android:title="@string/show_profile"
app:showAsAction="never"/>
<item
android:id="@+id/option2"
android:title="@string/report_pic"
app:showAsAction="never"/>
<item
android:id="@+id/option3"
android:title="@string/delete_pic"
app:showAsAction="never"/>
</menu>
fragment\u menu.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="fill_horizontal" >
<ImageView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:src="@drawable/ic_menu_back"
android:layout_marginLeft="@dimen/_5sdp"
android:layout_alignParentStart="true"
android:layout_marginStart="@dimen/_5sdp" />
</RelativeLayout>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="459"
android:viewportWidth="459">
<path
android:fillColor="#ffffff"
android:pathData="M178.5,140.25v-102L0,216.75l178.5,178.5V290.7c127.5,0,216.75,40.8,280.5,130.05C433.5,293.25,357,165.75,178.5,140.25z"/>
</vector>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/border_shadow">
<item
android:id="@+id/option1"
android:title="@string/show_profile"
app:showAsAction="never"/>
<item
android:id="@+id/option2"
android:title="@string/report_pic"
app:showAsAction="never"/>
<item
android:id="@+id/option3"
android:title="@string/delete_pic"
app:showAsAction="never"/>
</menu>
我一直在我的应用程序上尝试这些示例,但它们似乎都不起作用。我使用的是片段,其中一些片段必须显示back选项,而不是home。以下是我的实现(在Kotlin中):
注意:这些是片段中重写的onResume和onStop方法
备注:汉堡图标仅在调用toggle.syncState()方法时才会显示。我已经花了将近24个小时弄明白为什么家里的图标没有显示出来
希望我的帖子能帮助到别人。->如果你在homeactivity和initalfragment上有一个抽屉,你必须显示抽屉切换,在内部框架后,你不想显示抽屉代表抽屉,你必须显示后退按钮,并像这样更改所有框架的标题
- 在活动中公开你的行动
- 在您的主页片段中编写此代码
@Override
public void onResume()
{
super.onResume();
((HomeActivity)getActivity()).getSupportActionBar().setTitle("Home");
((HomeActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
((HomeActivity)getActivity()).actionBarDrawerToggle.setDrawerIndicatorEnabled(true);}
- 在其他片段中编写以下代码:
@Override
public void onResume()
{ super.onResume();
((HomeActivity)getActivity()).getSupportActionBar().setTitle("My Account");
((HomeActivity)getActivity()).actionBarDrawerToggle.setDrawerIndicatorEnabled(false);
((HomeActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
- 在您的主要活动中,请在backpressed上写下:
@Override
public void onBackPressed()
{
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStackImmediate();
} else {
super.onBackPressed();
}
}
在我看来,选择的答案太粗糙了
我试着实现它,在这样做的同时,我意识到
ActionBarDrawerToggle
实际上没有什么用处(也许这就是为什么它被从官方android教程中删除):当你想在导航抽屉和动作栏之间协调时,它不会让你的生活更轻松
问题是,你只有一个主页“按钮”,它有两种不同的功能-当你在主屏幕上时打开抽屉,当你在应用程序的较低位置时,向上移动。将工具栏作为参数传递给ActionBarDrawerToggle
constructor,向其添加菜单图标,并在单击事件时调用openDrawer。现在,如果你想切换到一个向上事件,你必须关闭这个特殊的图标,并重新启用动作栏固有的后退功能。。。还是一团糟
因此,如果ActionBarDrawerToggle
对你没有帮助(也许有人会想出一种方法来解决问题),为什么要首先使用它呢?以下是如何在没有它的情况下做到这一点:
boolean homeShouldOpenDrawer; // flag for onOptionsItemSelected
@Override
protected void onCreate(Bundle savedInstanceState) {
...
// if you're using NoActionBar theme
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar actionbar = getSupportActionBar();
// enables the home button with a <-
actionbar.setDisplayHomeAsUpEnabled(true);
// replaces the <- with the menu (hamburger) icon
// (ic_menu should be in every empty project, and can be easily added)
actionbar.setHomeAsUpIndicator(R.drawable.ic_menu);
// I assume your first fragment/state should be main screen, i.e. home = opens drawer
homeShouldOpenDrawer = true;
...
}
private void enableViews(boolean enable) {
if(enable) {
// Enables back button icon
// passing null or 0 brings back the <- icon
getSupportActionBar().setHomeAsUpIndicator(null);
homeShouldOpenDrawer = false;
} else {
// Enables burger icon
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
homeShouldOpenDrawer = true;
}
}
// this is called whenever a selection is made from the action bar
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (homeShouldOpenDrawer) {
drawerLayout.openDrawer(GravityCompat.START);
} else {
onBackPressed();
}
}
return super.onOptionsItemSelected(item);
}
boolean homeShouldOpenDrawer;//OnOptions ItemSelected的标志
@凌驾
创建时受保护的void(Bundle savedInstanceState){
...
(activity as MainActivity).supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_arrow_back)
if (supportFragmentManager.backStackEntryCount > 0) {
supportActionBar!!.setDisplayHomeAsUpEnabled(true)
toolbar.setNavigationOnClickListener {
if (supportFragmentManager.backStackEntryCount > 0) {
super.onBackPressed()
} else {
supportActionBar!!.setDisplayHomeAsUpEnabled(false)
drawerLayout.addDrawerListener(toggle)
toggle.syncState()
drawerLayout.openDrawer(GravityCompat.START)
}
}
} else {
supportActionBar!!.setDisplayHomeAsUpEnabled(false)
drawerLayout.addDrawerListener(toggle)
toggle.syncState()
}