导航回可重用活动

时间:2016-03-24 17:56:52

标签: java android android-activity

如何导航到可重复使用的活动,然后导航" UP"来电活动?

enter image description here

我有一个 MainActivity ,我打电话:

Intent intent = new Intent(MainActivity.this, ReusableActivity.class);
intent.put("SomeName", SomeData);
startActivity(intent);

我还有 OtherActivity ,也称 ReusableActivity

Intent intent = new Intent(OtherActivity.this, ReusableActivity.class);
intent.put("SomeName", SomeData);
startActivity(intent);

在我的 ReusableActivity 中,我有一个工具栏,可以显示" UP"箭头,以便用户可以导航回来。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ReusableActivity);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    }

如何让ReusableActivity将用户重新发送回正确的呼叫活动?

因此,如果我在OtherActivity上并转到ReusableActivity,当用户按下向上按钮时,它们将返回到OtherActivity

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myCompany.myApp">


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".LoginActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar"
            android:windowSoftInputMode="adjustPan">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".SearchView"
            android:label="@string/title_activity_search_view"
            android:parentActivityName=".MainActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar"
            android:windowSoftInputMode="adjustPan|adjustResize">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.myCompany.myApp.MainActivity" />
        </activity>
        <activity
            android:name=".SearchResultsList"
            android:label="@string/title_activity_search_results_list"
            android:parentActivityName=".SearchView"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.myCompany.myApp.SearchView" />
        </activity>
        <activity
            android:name=".ReusableActivity"
            android:label="@string/title_activity_details"
            android:parentActivityName=".SearchResultsList"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.myCompany.myApp.SearchResultsList" />
        </activity>
        <activity
            android:name=".OtherActivity"
            android:label="@string/title_activity_other"
            android:parentActivityName=".MainActivity"
            android:theme="@style/AppTheme.NoActionBar">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.myCompany.myApp.MainActivity" />
        </activity>
    </application>

</manifest>

3 个答案:

答案 0 :(得分:0)

如果您使用的是android support library,则可以看到课程NavUtils

来自javadoc

  

NavUtils为应用程序实现提供帮助程序功能    推荐的Android UI导航模式

参考 http://developer.android.com/intl/es/reference/android/support/v4/app/NavUtils.html

答案 1 :(得分:0)

Engraver实际上是对的,不确定为什么要投票。当您按下ReusableActivity中的UP按钮(工具栏中的后退箭头)时,您可以调用finish(),ReusableActivity将关闭,最后一个Activity将弹出,它将是图表中的MainActivity或OtherActivity。

也就是说,当按下工具栏中的UP按钮时,您需要覆盖onOptionsItemSelected以获得通知。

另外,请务必在活动上致电getSupportActionBar().setDisplayHomeAsUpEnabled(true);以显示向上按钮。

<强> ReusableActivity

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home: // Notice the id for the up button
            finish(); // Up button pressed so call finish.
            return(true);
    }

    return(super.onOptionsItemSelected(item));
}

注意:

您可能希望从清单中的ReusableActivity中删除元标记,以避免混淆父活动将会是什么,因为它将以编程方式覆盖。

<强>替代

如果由于某种原因您不想致电finish(),则可以开始新的活动。此意图将确保启动上一个活动,因此您无需跟踪。

Intent i = new Intent(this, MainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

您应该将启动器活动传递给intent(MainActivity.class),无论实际启动什么活动,intent中的操作和类别将负责启动正确的活动 < / p>

修改

由于您在使用它时遇到问题,我添加了此替代方案。

您可以尝试使用另一种方法,当您通过intent启动ReusableActivity时,会调用正在启动ReusableActivity的Activity类,当按下向上按钮时,只需启动Activity:

Intent intent = new Intent(MainActivity.this, ReusableActivity.class);
//the activity you want to start when pressing the up button
intent.put("parent", MainActivity.this);
startActivity(intent);

从OtherActivity启动ReusableActivity时执行相同的操作:

Intent intent = new Intent(OtherActivity.this, ReusableActivity.class);
//the activity you want to start when pressing the up button
intent.put("parent", OtherActivity.this);
startActivity(intent);

现在,当在OptionsActivity上按下向上按钮时,您将能够开始正确的活动。

<强> OptionsActivity

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:

            Class<?> parentActivityClass = (Class<?>)getIntent().getSerializableExtra("parent");
            Intent intent = new Intent(this, parentActivityClass);
            startActivity(intent);

            return(true);
    }

    return(super.onOptionsItemSelected(item));
}

答案 2 :(得分:-1)

不确定我理解你的问题。当用户按下后退箭头时,只需致电finish()