2

私は2つのアクティビティを持っています:MainActivityOtherActivityMainActivityにおけるフラグメントはOTHERACTIVITYを起動しますが、私は一番上に戻る]ボタンを押すと、それは代わりにOTHERACTIVITYを開始しましたフラグメントのMainActivityに私を返します。別のアクティビティから戻った後、MainActivityのフラグメントに戻りますか?

エンドユーザは、使用していたフラグメントではなくメイン画面にエンドユーザが戻ってきます。

これは私のマニフェストです。私はOTHERACTIVITYの親にMainActivityを設定している:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // ... 

    button.findViewById(R.id.events).setOnClickListener(new View.OnClickListener() { 

     Fragment ef = new MyItemsFragment(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.replace(R.id.content, ef, "my_fragment"); 
     fragmentTransaction.commit(); 
    }); 

} 

public void callOtherActivity() { 
    Intent i = new Intent(this, OtherActivity.class); 
    this.startActivity(i); 
} 

<activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity android:name=".OtherActivity" 
     android:parentActivityName="com.example.test.MainActivity" > 
    </activity> 

ユーザーがボタンをクリックMainActivity、で、それはリストのフラグメントをロードしますアイテムがList Fragmentでクリックされると、OtherActivityが起動されます。このコードの多くはアンドロイドスタジオによって自動生成されました。私はそれのいくつかを変更しました。 MyItemsRecyclerViewAdapterで:MainActivityで定義され、項目がリスト・フラグメントにクリックされたときOTHERACTIVITY起動することがを呼び出し

@Override 
public void onBindViewHolder(final ViewHolder holder, int position) { 
    holder.mItem = mValues.get(position); 

    holder.mView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (null != mListener) { 
       // Notify the active callbacks interface (the activity, if the 
       // fragment is attached to one) that an item has been selected. 
       mListener.onEventFragmentInteraction(holder.mItem); 

       MainActivity ma = (MainActivity) holder.mView.getContext(); 
       ma.callOtherActivity(); 

      } 
     } 
    }); 
} 

お知らせ。

これはOTHERACTIVITYです:

public class OtherActivity extends AppCompatActivity { 

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

} 

さて、私はOTHERACTIVITYでのバック矢印ボタンをクリックすると、アプリはちょうどMainActivityはなく、リストのフラグメントを示すことユーザーは最後に見た。

OtherActivityから戻ってきたら、ユーザーはユーザーエクスペリエンスを向上させるためにリストフラグメントを再度表示することができますか?

編集:「戻る」ボタンが混乱しているようです。多分彼らは同じですが、私は活動を切り替えるときに私は話しています。アプリケーションを終了するために使用される戻るボタンではありません。 See image

+0

フラグメントを呼び出す際にaddToBackStack(null)を削除してみてください –

+0

マニフェストファイルからアンドロイド:parentActivityName = "com.example.test.MainActivity"を削除して試してください。戻るボタンをクリックすると、MainActivityは基本的に私が間違っている場合はお知らせください。 –

+0

「戻る」ボタンは1つだけあり、通常はバックスタックをナビゲートするために使用されます。私はあなたの更新はあなたが "アップ"ボタンを指していると言っていると思います。 https://developer.android.com/training/appbar/up-actionhtml – Kuffs

答えて

0

ちょうどあなたがgetSupportFragmentManagerを()を使用することができますfragmentTransaction.addToBackStack(null);

0

この行を削除getBackStackEntryCount(); MainActivityのonBackPressedメソッドのメソッド OnClick bottomシステム戻るボタン。 以下の方法に従ってください。

@Override 
public void onBackPressed() {  
int backstack = getSupportFragmentManager().getBackStackEntryCount(); 
if (backstack > 0) { 
     getSupportFragmentManager().popBackStack(); 
    } else { 
      super.onBackPressed(); 
      System.exit(0); 
     }} 

先頭に戻るボタンを押します。 のonCreateメソッドまたはフラグメントコールのonCreateView方法で このデフォルトの方法

setHasOptionsMenu(true); 

、これを試してみて、メソッドの下にオーバーライドします。これは他の活動を開始してため

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
      getFragmentManager().popBackStack(); 
      break; 
     } 
     return super.onOptionsItemSelected(item); 
} 
0

あなたは結果のための活動を使用することができますすぐにOtherActivityを終了したいときは、setResultを実行してMainActivityがこの結果を受け取って、次の処理を実行します。

if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
     getSupportFragmentManager().popBackStack(); 
    } 

コードはMainActivity

public void callOtherActivity() { 
    Intent i = new Intent(this, OtherActivity.class); 
    startActivityForResult(i, 1); 
} 

と方法下記OTHERACTIVITYのonBackPress通話中にこのように行くだろう。

Intent returnIntent = new Intent(); 
returnIntent.putExtra("result",result); 
setResult(Activity.RESULT_OK,returnIntent); 
finish(); 

、今MainActivity onActivityresultで

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 1) { 
if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
      getSupportFragmentManager().popBackStack(); 
     } 
    } 
} 
0

あなたは新しい活動を開始するとあなたは、そのようなあなたが戻るキーを押したときのように、後でそれを取得することができますので、既存の1が積層されています。

[戻る]キーを押すと、アクティビティが再開されます。これは重要な部分です。最後に使用されたときとまったく同じように戻されるだけではありません。つまり、開発者は、アクティビティを元の状態に戻す必要があります。フラグメントはすでに正しい状態になっていますが、アクティビティの再起動時にその状態を上書きしないように注意する必要があります。

あなたのケースでは、MainActivityコードがフラグメントを無作為に再初期化するのではなく、その特定のアクティビティのフラグメントが存在するかどうかをチェックするのではないかと思われます。

あなたの質問にそのコードを含めていないので、確かに言うのは難しいです。 MainActivityのフラグメントを表示するコードを確認します。それらを表示する前に、既にフラグメントが表示されているかどうかチェックしていますか?そうでなければ、あなたはすべきです。

たとえば、アクティビティの下のコードは、フラグメントが新しいものを追加する前に既に表示されているかどうかをチェックします。基本的に、これが初めて実行されるときには、フラグメントは存在しないため、existingはNULLになり、新しいフラグメントが作成され、表示されます。

新しいOtherActivityなどを開始してからBackキーを使用してこのアクティビティに戻った後で、フラグメントシステムによって既存のフラグメントがコンテナに復元されるため、existingはnullになりません。したがって、実際には何もしません。

@Override 
protected void onCreate(Bundle b) { 
    super.onCreate(b); 

    Fragment existing = getSupportFragmentManager().findFragmentById(R.id.content); 

    if (existing == null) { 
     Fragment newFragment = new MyFragment(); 
     getSupportFragmentManager().beginTransaction() 
       .replace(R.id.content, newFragment) 
       .commit(); 
    } 

} 

希望です。

+1

そのフラグメントには既にデータがロードされていますので、 'fragmentTransaction.addToBackStack(null);'がありました。メインアクティビティが他のアクティビティから戻った後に再起動したときに、これをバックスタックから復元できませんか? – doejoe

+0

「R.id.content」は実際にはメインアクティビティのコンテンツです。それはフラグメントでなければならないので、 '.findFragmentByTag(" my_fragment ")'ボタンをクリックした後でトランザクションのタグを作成してからですか?しかし、それが存在する場合、既存のデータをどのようにロードするのですか?何も存在しない場合、サンプルはフラグメントをゼロから再作成します。 – doejoe

+0

あなたのフラグメント作成コードが含まれていないので、私の助言(およびコードサンプル)はかなり一般的です。それは関連しているかもしれませんが、それは一般的なエラーであり、私が人々にしたことを見て、あなたの問題の記述が、これが可能な原因のように聞こえるようにしました。 – Kuffs

関連する問題