在工具栏Android上显示后退箭头
我从我的应用程序从ActionBar
迁移到Toolbar
。 但是我不知道如何在Toolbar
上的Back Arrow上显示和设置点击事件,就像我在Actionbar
上做的Actionbar
。
用ActionBar
,我打电话给mActionbar.setDisplayHomeAsUpEnabled(true)
。 但是没有类似的方法。
有没有人曾经遇到这种情况,并以某种方式find解决办法?
如果您使用的是ActionBarActivity
那么您可以告诉Android使用Toolbar
作为ActionBar
如下所示:
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); setSupportActionBar(toolbar);
然后来电
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true);
将工作。 你也可以在连接到ActionBarActivities
碎片中使用它,你可以像这样使用它:
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); ((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);
如果您没有使用ActionBarActivities
或者您想要获取未设置为SupportActionBar
的Toolbar
上的后退箭头,则可以使用以下方法:
mActionBar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back)); mActionBar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //What to do on back clicked } });
如果您使用的是android.support.v7.widget.Toolbar
,则应将以下代码添加到您的AppCompatActivity
:
@Override public boolean onSupportNavigateUp() { onBackPressed(); return true; }
我看到很多答案,但这是我之前没有提到的。 它从API 8+起作用。
public class DetailActivity extends AppCompatActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); // toolbar Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); // add back arrow to toolbar if (getSupportActionBar() != null){ getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); } } @Override public boolean onOptionsItemSelected(MenuItem item) { // handle arrow click here if (item.getItemId() == android.R.id.home) { finish(); // close this activity and return to preview activity (if there is any) } return super.onOptionsItemSelected(item); }
你可以使用工具栏的setNavigationIcon方法。 Android文档
mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); mToolBar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handleOnBackPress(); } });
有很多方法可以做到,这里是我的最爱:
布局:
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:navigationIcon="?attr/homeAsUpIndicator" />
活动:
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // back button pressed } });
如果你使用的是AppCompatActivity
并没有使用它,因为你不想使用它提供的自动ActionBar
,因为你想分离出Toolbar
,因为你的Material Design需求和CoordinatorLayout
或者AppBarLayout
, ,考虑一下:
您仍然可以使用AppCompatActivity
,您不需要停止使用它,以便您可以在xml中使用<android.support.v7.widget.Toolbar>
。 只需closures操作栏样式 ,如下所示:
首先,从您在styles.xml
喜欢的NoActionBar主题之一派生一个样式,我使用Theme.AppCompat.Light.NoActionBar
如下所示:
<style name="SuperCoolAppBarActivity" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/primary</item> <!-- colorPrimaryDark is used for the status bar --> <item name="colorPrimaryDark">@color/primary_dark</item> ... ... </style>
在您的应用程序清单中,select您刚定义的子样式主题,如下所示:
<activity android:name=".activity.YourSuperCoolActivity" android:label="@string/super_cool" android:theme="@style/SuperCoolAppBarActivity"> </activity>
在你的Activity Xml中,如果工具栏是这样定义的:
... <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" /> ...
然后,这是最重要的部分,您将支持Action栏设置为您正在扩展的AppCompatActivity,以便xml中的工具栏成为操作栏。 我觉得这是一个更好的方法,因为你可以简单地做许多事情,比如菜单,自动活动标题,项目select处理等,而不需要添加自定义点击处理程序等。
在您的Activity的onCreate覆盖中,执行以下操作:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_super_cool); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); //Your toolbar is now an action bar and you can use it like you always do, for example: getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setNavigationIcon(R.drawable.back_arrow); // your drawable toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); // Implemented by activity } });
而对于API 21+ android:navigationIcon
<android.support.v7.widget.Toolbar android:navigationIcon="@drawable/back_arrow" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"/>
我使用了Google Developer Documentation中的这个方法:
@Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); }
如果你得到一个空指针exception,它可能取决于主题。 尝试在清单中使用不同的主题,或者使用此替代方法:
@Override public void onCreate(Bundle savedInstanceState) { ... getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
然后在清单中,我为当前活动设置父级活动:
<activity android:name="com.example.myapp.MyCurrentActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myapp.MyMainActivity" /> </activity>
我希望这能帮到您!
如果你不想创build一个自定义的Toolbar
,你可以这样做
public class GalleryActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { ... getSupportActionBar().setTitle("Select Image"); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); } } }
在你的AndroidManifest.xml
<activity android:name=".GalleryActivity" android:theme="@style/Theme.AppCompat.Light" > </activity>
你也可以把这个android:theme="@style/Theme.AppCompat.Light"
放到<aplication>
android:theme="@style/Theme.AppCompat.Light"
<aplication>
标签中,应用于所有的活动
MyActivity extends AppCompatActivity { private Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { ... toolbar = (Toolbar) findViewById(R.id.my_toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); toolbar.setNavigationOnClickListener(arrow -> onBackPressed()); }
这工作完美
public class BackButton extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.chat_box); Toolbar chatbox_toolbar=(Toolbar)findViewById(R.id.chat_box_toolbar); chatbox_toolbar.setTitle("Demo Back Button"); chatbox_toolbar.setTitleTextColor(getResources().getColor(R.color.white)); setSupportActionBar(chatbox_toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); chatbox_toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Define Back Button Function } }); } }
在您想要添加后退button的活动的清单文件中,我们将使用属性android:parentActivityName
<activity android:name=".WebActivity" android:screenOrientation="portrait" android:parentActivityName=".MainActivity" />
PS此属性是在API级别16中引入的。