Android – 后退button在标题栏中
在许多应用程序(日历,云端硬盘,Play商店),当你点击一个button,并input一个新的活动,标题栏中的图标变成后退button,但对于我所做的应用程序,它不这样做。 我如何让这个图标带你回到上一个屏幕?
在标题栏中创build后退button有两个简单的步骤:
首先,使用下面的代码将应用程序图标点击,在标题栏中您想要有一个后退button:
ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true);
添加上面的代码后,您将看到应用程序图标左侧出现一个后退箭头。
其次,在完成上述操作之后,您仍然需要创build利用click事件的代码。 要知道,当你真的点击应用程序图标时,会调用onOptionsItemSelected方法。 所以要回到之前的活动中,将该方法添加到您的活动中,并将Intent代码放入其中,以便将您返回到之前的活动。 例如,假设您正在尝试返回的活动名为MyActivity。 回到它写的方法如下:
public boolean onOptionsItemSelected(MenuItem item){ Intent myIntent = new Intent(getApplicationContext(), MyActivity.class); startActivityForResult(myIntent, 0); return true; }
而已!
(在Android开发者API中,它build议搞清楚清单并添加像android:parentActivityName这样的东西,但是这对我来说似乎不起作用,以上更简单,更可靠。
使用这个代码
@Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); }
之后,写这个代码在onOptionsItemSelected
方法
int id = item.getItemId(); if (id==android.R.id.home) { finish(); }
我终于设法正确地将button添加到操作栏/工具栏
@Override public void onCreate(Bundle savedInstanceState) { ... getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } public boolean onCreateOptionsMenu(Menu menu) { return true; }
1.-将活动添加到AndroidManifest.xml并确保提供元数据:
<activity android:name="com.example.myfirstapp.DisplayMessageActivity" 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.myfirstapp.MainActivity" /> </activity>
2.-将以下代码添加到活动的onCreate方法:
@Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); }
3.-覆盖onOptionsItemSelected并使用NavUtils.navigateUpFromSameTask()静态方法导航抛出堆栈。
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); }
但是,只有当您的应用程序是当前任务的所有者时(也就是说,用户从您的应用程序开始执行此任务),才能使用navigateUpFromSameTask()。 如果这不是真的,并且您的活动是在属于另一个应用程序的任务中启动的,那么导航Up应创build一个属于您的应用程序的新任务,这需要您创build一个新的后退堆栈。
如果您的活动确实扩展活动
public class YourActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_xxx); getActionBar().setHomeButtonEnabled(true); [...] } [...] }
如果您的操作扩展了AppCompatActivity
public class YourActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_xxx); getSupportActionBar().setHomeButtonEnabled(true); [...] } [...] }
没有更多的事情,请参阅加起来的行动
[可选]要显式定义父活动,请修改您的Manifest.xml,如下所示:
<application ... > ... <!-- The main/home activity (it has no parent activity) --> <activity android:name="com.example.myfirstapp.MainActivity" ...> ... </activity> <!-- A child of the main activity --> <activity android:name="com.example.myfirstapp.YourActivity " 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.myfirstapp.MainActivity" /> </activity> </application>
请参阅指定父级活动
如果您在android studio中使用5.1的新支持库,则可以在AppCompatActivity上使用此库
ActionBar actionBar = getSupportActionBar(); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp); actionBar.setDisplayShowHomeEnabled(true);
干杯。
如果你正在使用一个ActionBar,你将要阅读这个文档http://developer.android.com/reference/android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean);
然后,你必须覆盖onOptionsItemSelected(MenuItem)的方法,并寻找android.R.id.home事件进来。然后,你知道用户点击了操作栏上的后退button
没有使用ActionBarActivity
轻量级版本仍然具有相同的bahaviors:
public class ToolbarConfigurer implements View.OnClickListener { private Activity activity; public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) { toolbar.setTitle((this.activity = activity).getTitle()); if (!displayHomeAsUpEnabled) return; toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); toolbar.setNavigationOnClickListener(this); } @Override public void onClick(View v) { NavUtils.navigateUpFromSameTask(activity); } }
用法:把new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);
在onCreate
。
最简单的方法和最佳实践在谷歌解释在这里 :
1.在AndroidManifest.xml
为您的childActivity添加一个父项:
<activity android:name=".ChildActivity" android:parentActivityName=".ParentActivity" > </activity>
2.激活您的childActivity中的后退button:
myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);
为我工作,我希望它也适用于你。
如果您的活动扩展了AppCompatActivity
,则需要像这样覆盖onSupportNavigateUp()
方法:
public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); ... } @Override public void onBackPressed() { super.onBackPressed(); this.finish(); } @Override public boolean onSupportNavigateUp() { onBackPressed(); return true; } }
在onBackPressed()
方法中处理逻辑,只需在onSupportNavigateUp()
调用该方法,以便手机上的后退button和工具栏上的箭头执行相同的操作。
你也可以简单地把onBackPressed()
放在你的onClick监听器中。 这会导致您的button在Android应用程序中像默认的“后退/上移”button一样操作!
您需要在清单文件中添加下面提到的代码。 search要添加后退箭头function的活动。 如果你发现一个罚款或创build活动
<activity android:name=".SearchActivity"> </activity>
然后在两者之间添加以下三行代码。
<meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.raqib.instadate.MainActivity" />
并且不要忘记在onCreate()中添加这段代码。 您需要向后箭头的特定活动的方法。
Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar); setSupportActionBar(toolbar); try{ getSupportActionBar().setDisplayHomeAsUpEnabled(true); }catch(NullPointerException e){ Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION"); }
这是我如何解决这个问题。 谢谢。
通过在应用程序清单中指定父级活动,也可以在没有代码的情况下完成。如果要在活动B中获得活动A的后退button,只需在活动清单中将活动A添加为活动B的父级。