我有一个活动A,该活动根据groupName字段显示三个片段。我有一个启动另一个活动B的菜单按钮。当我单击此按钮然后单击“后退”按钮时,活动A中的groupName为null。我也尝试使用savedInstanceState保存和还原,但无济于事。我认为这是没有必要的,因为活动A从未被破坏。

我已经检查了Android清单,两个活动均已正确注册,活动A是活动B的父级。

public class GroupOverviewActivity extends AppCompatActivity implements MyTasksInteractionListener, OnGroupTasksFragmentInteractionListener {

private static final String TAG = "GroupOverviewActivity";

private String groupName;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_group_overview);

    if (savedInstanceState != null) {
        groupName = savedInstanceState.getString("groupname");
    } else if (getIntent() != null && getIntent().getExtras() != null) {
        groupName = getIntent().getExtras().getString("groupname");
    }
}

@Override
protected void onResume() {
    super.onResume();

    setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
    final ActionBar bar = getSupportActionBar();
    if (bar != null) {
        bar.setDisplayHomeAsUpEnabled(true);
        bar.setTitle(groupName);
    }

    getSupportFragmentManager().beginTransaction()
        .add(R.id.group_overview_fragment, GroupMyTasksFragment.newInstance(groupName), null)
        .disallowAddToBackStack()
        .commit();

    final BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
    bottomNavigationView.setOnNavigationItemSelectedListener(
        new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
                item.setChecked(true);
                switch (item.getItemId()) {
                    case R.id.item_activity:
                        getSupportFragmentManager().beginTransaction()
                            .replace(R.id.group_overview_fragment, GroupActivityFragment.newInstance(groupName))
                            .disallowAddToBackStack()
                            .commit();
                        break;
                    case R.id.item_schedule:
                        getSupportFragmentManager().beginTransaction()
                            .replace(R.id.group_overview_fragment, GroupScheduleFragment.newInstance(groupName))
                            .disallowAddToBackStack()
                            .commit();
                        break;
                    case R.id.item_tasks:
                        getSupportFragmentManager().beginTransaction()
                            .replace(R.id.group_overview_fragment, GroupMyTasksFragment.newInstance(groupName))
                            .disallowAddToBackStack()
                            .commit();
                        break;
                }
                return false;
            }
        });
}

@Override
protected void onSaveInstanceState(final Bundle outState) {
    outState.putString("groupname", groupName);

    super.onSaveInstanceState(outState);
}

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.group_overview, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(final MenuItem item) {
    if (item.getItemId() == R.id.item_members) {
        final Intent intent = new Intent(this, GroupMembersActivity.class);

        intent.putExtra(GroupMembersActivity.ARG_PARAM1, groupName);
        startActivity(intent);
    }

    return true;
}


活动的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="giphouse.nl.proprapp.ui.group.overview.GroupOverviewActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ProprTheme.AppBarOverlay"
        android:id="@+id/appBarLayout">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ProprTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>


    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/appBarLayout"
        android:id="@+id/group_overview_fragment">

    </FrameLayout>

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:itemBackground="@color/colorPrimary"
        app:itemIconTint="@drawable/nav_item_color_state"
        app:itemTextColor="@drawable/nav_item_color_state"
        android:layout_alignParentBottom="true"
        app:menu="@menu/bottom_navigation_group_overview">

    </android.support.design.widget.BottomNavigationView>

</RelativeLayout>


GroupOverviewActivity的启动方式:

    final Intent intent = new Intent(context, GroupOverviewActivity.class);
    intent.putExtra("groupname", dto.getGroupName());

    itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            context.startActivity(intent);
        }
    });


相关的日志记录。每个语句后面都附加了goupname的值:

11-20 08:32:16.181 4906-4906/giphouse.nl.proprapp E/GroupOverviewActivity: onCreate DEVTEAM
11-20 08:32:16.185 4906-4906/giphouse.nl.proprapp E/GroupOverviewActivity: onStart DEVTEAM
11-20 08:32:16.222 4906-4906/giphouse.nl.proprapp E/GroupOverviewActivity: onResume DEVTEAM


单击菜单项后,启动活动B:

11-20 08:32:22.766 4906-4906/giphouse.nl.proprapp E/GroupOverviewActivity: Saving instance state DEVTEAM
11-20 08:32:22.038 4906-4906/giphouse.nl.proprapp E/GroupOverviewActivity: onPause DEVTEAM


活动B启动并可见后:

11-20 08:32:22.769 4906-4906/giphouse.nl.proprapp E/GroupOverviewActivity: onStop DEVTEAM
11-20 08:32:27.122 4906-4906/giphouse.nl.proprapp E/GroupOverviewActivity: onDestroy DEVTEAM


点击后退按钮后:

11-20 08:32:27.299 4906-4906/giphouse.nl.proprapp E/GroupOverviewActivity: onCreate null
11-20 08:32:27.300 4906-4906/giphouse.nl.proprapp E/GroupOverviewActivity: onStart null
11-20 08:32:27.315 4906-4906/giphouse.nl.proprapp E/GroupOverviewActivity: onResume null


请注意,不会调用onRestoreInstanceState。在onCreate中,savedInstanceState为null。

为了完整起见,关联了AndroidManifest的相关部分:

    <activity
        android:name=".ui.group.overview.GroupOverviewActivity"
        android:label="@string/title_activity_group_tabbed"
        android:parentActivityName=".ui.group.GroupListActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="giphouse.nl.proprapp.ui.group.GroupListActivity" />
    </activity>

    <activity android:name=".ui.group.GroupMembersActivity"
        android:label="@string/item_title_members"
        android:parentActivityName=".ui.group.overview.GroupOverviewActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="giphouse.nl.proprapp.ui.group.overview.GroupOverviewActivity" />
    </activity>




解决方案(通过遵循来自realharry的种类指针找到)是手动覆盖onOptionsItemSelected,因为默认实现显然创建了一个新活动。 (我在这里Up Button Calls OnDestroy of Parent Activity找到了它)。

最佳答案

您的groupname变量是否可能从未设置过,因此开头为null?也许您缺少在按钮单击处理程序中设置此变量的逻辑?

编辑:基于注释/更新的代码示例,这似乎不太可能。您的代码看起来不错。我看不到任何明显的原因可能导致此问题。

我有一些建议。

(1)尝试覆盖onRestoreInstanceState(),然后在此处设置groupName。看看那有什么区别。

(2)如果这不起作用,则可以尝试在单例类中存储/检索groupName(其生存期长于每个活动的生存期)。显然,这是一个hack,但是您可以尝试一下,看看会发生什么。无论它是否起作用(应该起作用)(不管它是否起作用)(都会变得更加奇怪),您都将获得一些见识,并提出下一步的建议。

(3)显然,最好的办法是在调试器中运行您的应用程序,并查看当执行各种UI操作时groupName发生了什么。

(4)如果这不可行,则再次冒着明显的风险,只需在程序的各个点(例如,在调用groupName之前,等)打印/登录bar.setTitle()。您可能仅为了添加日志记录就必须重写一些活动生命周期方法(例如,onPause()onStart()等)。这样,您可以缩小精确地将groupName重置为null的位置(如果有的话)。

关于java - 启动子 Activity 后, Activity 中的字段设置为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47371348/

10-10 00:34