当前位置: 首页 > 知识库问答 >
问题:

如何实现Android ActionBar后退按钮?

张建树
2023-03-14

我有一个带有列表视图的活动。当用户单击项目时,项目“查看器”打开:

List1.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

        Intent nextScreen = new Intent(context,ServicesViewActivity.class);
        String[] Service = (String[])List1.getItemAtPosition(arg2);

        //Sending data to another Activity
        nextScreen.putExtra("data", datainfo);
        startActivityForResult(nextScreen,0);
        overridePendingTransition(R.anim.right_enter, R.anim.left_exit);
    }
});

这很好,但在操作栏上,应用图标旁边的后退箭头没有被激活。我错过什么了吗?

共有3个答案

桓风史
2023-03-14

要启用ActionBar后退按钮,显然您的活动中需要一个ActionBar。这是由您使用的主题设置的。您可以在AndroidManfiest中设置活动的主题。xml。如果您使用的是android:样式/主题。NoTitleBar主题,您没有操作栏。在这种情况下,对getActionBar()的调用将返回null。因此,首先确保你有一个ActionBar。

下一步是将android:parentActivityName设置为您想要导航的活动,如果您按下后退按钮。这应该在AndroidManifest中完成。xml也是。

现在您可以在“子”活动的onCreate方法中启用返回按钮。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

现在,您应该实现后退按钮的逻辑。您只需覆盖“child”活动中的onOptionsItemSelected方法,并检查返回按钮的id,该按钮是android。R、 id.home

现在可以启动方法NavUtils。navigateUpFromSameTask(本)

有时这是你想要的,因为它提醒你忘记了“某事”。因此,如果要防止出现这种情况,可以使用getParentActivityIntent()方法检查活动是否有父级。如果返回null,则表示您没有指定父级。

在这种情况下,您可以启动与用户按下设备上的后退按钮基本相同的方法。一个不会使应用程序崩溃的好实现是:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            if (getParentActivityIntent() == null) {
                Log.i(TAG, "You have forgotten to specify the parentActivityName in the AndroidManifest!");
                onBackPressed();
            } else {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

请注意,用户看到的动画在NavUtils之间是不同的。navigateUpFromSameTask(本)和onBackPressed()

这取决于你走哪条路,但我发现这个解决方案很有帮助,尤其是如果你在所有活动中使用基类。

方航
2023-03-14

确保在活动中启用了ActionBar Home按钮:

@Override
public void onBackPressed() {
     ...
     super.onBackPressed();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

扩展ActionBarActive的示例MainActive

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home: 
            // API 5+ solution
            onBackPressed();
            return true;

        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

这样你想要的所有活动都可以有背压。

http://developer.android.com/training/implementing-navigation/ancestral.html

androidManifest.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.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

扩展ActionBarActive的示例MainActive

public class MainActivity extends ActionBarActivity {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Back button
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @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);
    }
}
宿镜
2023-03-14

Selvin已经发布了正确的答案。这里,漂亮代码中的解决方案:

public class ServicesViewActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // etc...
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }
}

函数NavUtils。navigateUpFromSameTask(this)要求您在AndroidManifest中定义父活动。xml文件

<activity android:name="com.example.ServicesViewActivity" >
    <meta-data
     android:name="android.support.PARENT_ACTIVITY"
     android:value="com.example.ParentActivity" />
</activity>

请参阅此处了解更多信息。

 类似资料:
  • 问题内容: 我有一个带有列表视图的活动。当用户单击项目时,将打开项目“查看器”: 效果很好,但是在操作栏上,应用图标旁边的向后箭头没有被激活。我想念什么吗? 问题答案: Selvin已经发布了正确答案。在这里,用漂亮的代码解决方案: 该函数要求您在AndroidManifest.xml文件中定义父活动 请参阅此处以进一步阅读。

  • 我正在使用android导航组件库。我用导航图设置了两个片段。我想在我的片段内按下后退按钮时做一些额外的动作。 我使用这段代码来处理工具栏上的按钮点击,但我也想处理后退按钮按下。我该怎么做?

  • 我用这个教程来实现facebook登录等。 Facebook登录 我在这里添加了新的片段来显示朋友列表。现在,当我在新添加的片段上按下后退按钮时,它会把我带到SPLASH片段,我想要动作栏上同样的后退按钮行为。这意味着当我在我的新片段上时,它会在动作栏上显示一个后退按钮。按下后退按钮会把我带回SPLASH屏幕。

  • 我试图用这段代码来显示我的个人档案活动: 当我点击Profile菜单项时,我可以看到我的ProfileActivity,但我的ActionBar上没有任何back按钮来返回我以前的活动。 那么,我如何显示一些后退按钮?我的代码是否正确以显示菜单中的活动?

  • 我正在编写一个小型PyQt4应用程序,它只是一个“是/否”对话框,必须执行一个外部命令(例如“eject/dev/sr0”)并退出。 应用程序运行时,它在按下“是”按钮后执行命令,但我无法在执行命令时使对话框本身退出。 这是我的密码。当我单击“是”时,它会正确地调用'eject/dev/sr0'命令,但在此之后对话框仍然可见。我必须单击“否”关闭应用程序,我希望它在执行命令时自动关闭。我应该添加/