2017-11-18 7 views
0

アクティビティAがあり、groupNameフィールドに従って3つのフラグメントが表示されます。私は別のアクティビティBをlauchesメニューボタンがあります。このボタンをクリックし、戻るボタンをクリックすると、groupNameはアクティビティAでnullです。私はsaveInstanceStateを使ってセーブとリストアを試みましたが、役に立たなかった。アクティビティAは決して破壊されないので、これが必要だとは思わない。子アクティビティの起動後にアクティビティのフィールドがnullに設定される

私は、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); 
     } 
    }); 

関連するログ。アクティビティ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 

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 

後メニュー項目が活性Bを起動クリックすると

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 

:各ステートメントはgoupnameの値が付加されていますヒットボタン:

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> 

SOLUTION

(realharryから一種のポインタに従うことによって見出さ)溶液を、onOptionsItemSelectedを上書きmanualltすることであったデフォルト理由実装はapparantly新しい活動を作成します。 (私はそれをここに見つけたUp Button Calls OnDestroy of Parent Activity)。

答えて

2

groupname変数が設定されていない可能性がありますか?ボタンクリックハンドラでこの変数を設定するロジックが不足している可能性がありますか?

EDIT:コメント/更新されたコードのサンプルに基づいていますが、それはそう思わないでしょう。あなたのコードは正常に見えます。私はこの問題を引き起こしている可能性のあることは明らかではありません。

しかし、私はいくつかの提案があります。

(1)onRestoreInstanceState()を無効にして、groupNameに設定してください。違いがあれば見てください。

(2)それでもうまくいかない場合は、groupNameをシングルトンクラス(各アクティビティのライフタイムより長い寿命)で保存してみてください。明らかに、これはハックですが、これを試して何が起こるか見ることができます。それがうまくいくかどうか(より奇妙になる)にかかわらず、あなたは次の進め方を示唆するいくつかの洞察力を得るでしょう。

(3)明らかに、デバッガでアプリケーションを実行して、さまざまなUIアクションを実行するときにgroupNameがどうなるかを確認するのが最もよい方法です。

(4)明らかではない場合は、プログラムのさまざまな時点で(例えば、bar.setTitle()などに電話する前に)groupNameを印刷してログに記録してください。ロギングを追加するためだけに、アクティビティのライフサイクルメソッドをいくつかオーバーライドする必要があります(例:onPause()onStart()など)。こうすれば、正確にgroupNameがヌルにリセットされた場所を絞り込むことができます。

+0

onCreateView関数では、アクティビティの作成に使用されたインテントが検索されます。アクティビティが初めて開始されたとき、私はgroupnameが正しい値を持っていることがわかります。 – Hayeb

+0

上記のようにあなたの例はそれを示していません。どの活動が行われているのでしょうか?関連するコードを投稿すると、何が起こっているのかがわかります。また、 'activity_group_overview'の投稿、またはグループ名が表示されている他のレイアウト。 – realharry

+0

これがどのように行われたかを示すためにadditonal code snippetsを追加しました。 – Hayeb

関連する問題