Answers:
有两个简单的步骤可在标题栏中创建后退按钮:
首先,在活动中要使用其后退按钮的标题栏中,使用以下代码使应用程序图标可单击:
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
添加以上代码后,您将看到一个后退箭头出现在应用程序图标的左侧。
其次,完成上述操作后,您仍然必须创建将利用click事件的代码。为此,请注意,当您实际单击应用程序图标时,onOptionsItemSelected
调用方法。因此,要返回上一个活动,请将该方法添加到您的活动中,并Intent
在其中添加代码,这将使您返回上一个活动。例如,假设您要返回的活动称为MyActivity
。要回到它,编写方法如下:
public boolean onOptionsItemSelected(MenuItem item){
Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
而已!
(在Android开发人员API中,建议您将清单弄乱,并添加诸如之类的内容android:parentActivityName
。但这对我来说似乎不起作用。上面的方法更简单,更可靠。)
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
在你的活动中
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
使用此代码
@Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
}
之后,在onOptionsItemSelected
方法中编写此代码
int id = item.getItemId();
if (id==android.R.id.home) {
finish();
}
getActionBar()
给我一个空; 你知道为什么吗?
我终于设法正确地向操作栏/工具栏添加了返回按钮
@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);
}
但是,仅当您的应用是当前任务的所有者(即用户从您的应用开始此任务)时,才适合使用NavigationUpFromSameTask()。如果不是这样,并且您的活动是在属于另一个应用程序的任务中启动的,则向上导航应创建一个属于您应用程序的新任务,这需要您创建一个新的后退堆栈。
如果您的活动确实扩展了活动
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>
请参阅指定父活动
如果您的活动扩展了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()
即可使电话上的后退按钮和工具栏上的箭头起到相同的作用。
首先,您需要编写此代码
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
然后在清单中添加此行
<activity android:name=".MainActivity"
android:parentActivityName=".PreviousActivity"></activity>
我认为它将起作用
如果您在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);
干杯。
谷歌在这里解释的最简单的方法和最佳实践:
1.在以下位置为您的childActivity添加父项AndroidManifest.xml
:
<activity
android:name=".ChildActivity"
android:parentActivityName=".ParentActivity" >
</activity>
2.激活childActivity中的后退按钮:
myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);
为我工作,我希望它也对您有用。
经过一段美好的时光,我发现代码中的主要问题是主题选项,以下是向我展示工具栏的正确方法
首先在AndroidManifest文件中,您必须更改主题样式
Theme.AppCompat.Light.DarkActionBar
to
Theme.AppCompat.Light.NoActionBar
然后在您的活动xml中,您需要调用自己的工具栏,例如
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:id="@+id/toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:elevation="4dp"/>
然后应通过以下方式在您的Java文件中调用此工具栏:
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
对于显示U的工具栏,应检查null以避免NullPointerException
if(getSupportActionBar() != null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
对于家庭活动,请添加此
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()==android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
或者为您想要的活动返回
public boolean onOptionsItemSelected(MenuItem item){
Intent myIntent = new Intent(getApplicationContext(), YourActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
我看到了这么多复杂的答案,所以这是我的代码。在这里工作 您可以通过两种方式实现这一目标。
1)Stardard android兼容性
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;
import android.view.MenuItem;
import android.view.View;
public class EditDiscoveryActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_discovery);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
/*toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});*/
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
return true;
}
}
2)使用自定义图标
如果要在注释中使用代码,则只需将此文件添加到可绘制的ic_arrow_white_24dp.xml文件中
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#ffffff"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
</vector>
有了这段代码。
toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
希望它能对这里的人有所帮助!
不使用ActionBarActivity
它的轻量级版本在这里仍然具有相同的行为:
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
。
您需要在清单文件中添加以下提到的代码。搜索要在其中添加后退箭头功能的活动。如果找到一个,那么就好或创建活动
<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");
}
这就是我解决问题的方式。谢谢。
其他答案没有提到您也可以在Toolbar
小部件的XML中进行设置:
app:navigationIcon="?attr/homeAsUpIndicator"
例如:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:navigationIcon="?attr/homeAsUpIndicator"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/title_activity_acoustic_progress" />
2020年您需要做的一切:(
考虑到您想返回MainActivity)
protected void onCreate(Bundle savedInstanceState){
...
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public boolean onOptionsItemSelected(MenuItem item) {
Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
startActivityForResult(myIntent, 0);
return true;
}
如果您使用的是ActionBar,则需要阅读本文档 http://developer.android.com/reference/android/app/ActionBar.html#setDisplayHomeAsUpEnabled(boolean)
然后,您必须覆盖方法onOptionsItemSelected(MenuItem)并查找要插入的android.R.id.home事件。然后,您知道用户已单击操作栏上的该后退按钮。
对于Kotlin:
override fun onOptionsItemSelected(item: MenuItem): Boolean {
onBackPressed();
return true;
}
我需要混合一些答案才能为我找到正确的答案,因为我的应用程序具有3个可以随时返回的活动。活动1>活动2>活动3。当我在activity3上执行某项操作时,后退按钮已正确备份到Activity2。但是,从Activity2使用finish()
,它返回到Activity3而不是Activity1。我正在扩展AppCompatActivity。因此,我的解决方案是:
public class Activity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
...
getSupportActionBar().setHomeButtonEnabled(true);
}
}
在AndroidManifest.xml上:
<activity android:name=".activities.Activity2"
android:parentActivityName="com.example.appname.activities.Activity1">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.appname.activities.Activity1" />
</activity>
最后,我菜单上的操作按钮(操作栏):
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
...
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
使用NavUtils.navigateUpFromSameTask(this);
对我有用,而不是finish()
。
只是分享一些对我有帮助并且可能对其他人有用的东西。尽管这里的大多数答案都是正确的,但是使用getActionBar().setDisplayHomeAsUpEnabled(true);
,这对我来说不起作用。我遇到的问题是我试图手动创建第二个“活动”,但是涉及更多细节。
真正解决我问题的方法是遵循Android开发人员教程(https://developer.android.com/training/basics/firstapp/starting-activity),使用Android Studio自己的工具创建第二个Activity:
Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.
Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (getSupportActionBar()==null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==android.R.id.home)
finish();
return super.onOptionsItemSelected(item);
}
这对我有用。假设有两个活动(Activityone,Activitytwo)
在ActivityTwo内部使用此代码
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
在Activityone上
//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));
这应该包含在清单文件中的第二个活动中
<activity android:name=".Activitytwo"
android:parentActivityName=".Activityone"></activity>
结果是这样的
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.YourxmlFileName);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id==android.R.id.home) {
finish();
return true;
}
return false;
}