2016-09-13 10 views
0

フラグメント内のバック/アップボタンに問題があります。 私にはいくつかの断片があるアクティビティがあります。私が「1」と呼んでいる1つのフラグメントでは、私はリストビューを持っています。アイテムをクリックすると、別のフラグメント "2"に移動します。 バック・アップ・ボタンがフラグメント2のみで機能し、フラグメント1では機能しないような機能が必要です。フラグメントと戻るボタン

この方法はありますか? は私が活動でこれを試してみましたが、私は理解していないどのようにすることができ、このヘルプ:

fragment = new MaterialesFragment(); 
    FragmentManager fragmentManager3 = getFragmentManager(); 
    fragmentManager3.beginTransaction().replace(R.id.frame, fragment).addToBackStack("tagMateriales").commit(); 

ありがとう:

@Override 
public void onBackPressed() { 

    int count = getFragmentManager().getBackStackEntryCount(); 

    if (count == 0) { 
     super.onBackPressed(); 
     //additional code 
    } else { 
     getFragmentManager().popBackStack(); 
    } 

} 

私はフラグメント2にフラグメント1から変更した場合、私はこのコードを持っています

+0

から?フラグメント2〜1?その明確でない –

+0

あなたの活動のonCreateを追加してください。そして、どのように2番目の断片を追加しますか?あなたは交換を使用していますか?詳細を教えてください。 – masp

+0

トランザクションに '.addToBackStack(null)'を使用するだけで、コミットする前にフラグメント2に切り替わります。 – Vucko

答えて

0

:-)多くは、あなたが画面にfragment2を置き換えるために使用FragmentTransactionオブジェクトにaddToBackStack()メソッドを使用してみてください:

fragmentManager.beginTransaction().replace(R.id.content_frame,fragment2).addToBackStack("tagHere").commit(); 

実際のタグが不要な場合は、nullをパラメータとして渡すことができます。

+0

私はすでにaddToBackStackを追加しました:S –

0

あなたの「断片2」(フラグメントは、トップ層の上に表示されますので)tagは、活動のあなたのルートビューのID Stringクラス名であるかもしれない

public void showFragmentWithoutStack(Fragment fragment, String tag, int id) { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    transaction.add(id, fragment, tag); 
    transaction.commitAllowingStateLoss(); 
} 

ためにこのコードを使用してください。

+0

お返事ありがとうございます、私にこれを追加する必要がありますか教えてください。ありがとう:) –

+0

私はあなたのアクティビティでそのメソッドを作成します、例えばBaseActivity。あなたの活動では、上記の方法が必要です。フラグメント化されている場合は、メソッド 'protected void showFragmentWithoutStack(フラグメントフラグメント、ストリングタグ、int id){ ((BaseActivity)getActivity())メソッドが必要です。 } 'アクティビティ – Michael

0

あなたは疑問を持っているとして活動中onBackPressed()メソッドのオーバーライドを使用するためには、あなたもあなたのフラグメントにこれを追加する必要があります。

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
     // Assuming MainActivity is the Activity subclass name 
     if (getActivity() instanceof MainActivity) { 
      ((MainActivity) getActivity()).onBackPressed(); 
     } 
     return true; 
     default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

表示/戻るボタンを非表示にし、追加するためにこれらのメソッドをアクティビティに追加する:

public void showUpButton() { 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 

public void hideUpButton() { 
    getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
} 

次に、フラグメントからバック/アップボタンを表示または非表示にするには、これらのメソッドを呼び出します。あなたのケースでは

、あなたは断片1でonResume()からバック/アップボタンを隠すことができます:

((MainActivity) getActivity()).hideUpButton(); 

そしてフラグメント2でonResume()でそれを示しています

((MainActivity) getActivity()).showUpButton(); 
+0

からフラグメントを制御する必要があります。私のフラグメント2でこれを追加しますが、同じことが起こっています(両方のフラグメントが"戻る "ボタンで戻ってきます)。この機能を持っていて、フラグメント1は "ブロックされた"のようになります。 –

+0

戻るボタンの矢印が表示されますが、クリックするとメニューが表示されます。どの部分を手伝って断片1と呼ぶ必要がありますか?あなたの時間と助けてくれてありがとう。 –

+0

@StephySamaniegoあなたの 'onOptionsItemSelected()'メソッドでケースを分離する必要があるように思えます。 'case android.R.id.home'に注目してください。 –

0

がたくさんありますこの仕事をする方法の。私の意見では、最もエレガントなものは次のとおりです。私は各コンポーネントのロジックを分離します。すべてのフラグメントは、アクティビティとフラグメントが通信できるようにする "IBackHandler"のようなインタフェースを実装します。アクティビティでonBackPressedは最初にフラグメント(インスタンス化されている場合)を実行してから何をするかを尋ねます。

インタフェース:

public interface IBackHandler { 
    boolean doBack(); 
} 

そのインタフェースを実装し、押された戻るボタン処理するためのロジックを置くの断片:

public class YourFragment1 extends YourBaseFragment implements IBackHandler { 
     // your code 
     @Override 
     public boolean doBack() { 
      // return true means that you have done your stuff 
      //and you don't want 'super.onBackPressed()' to be called 
      return true; // this means do nothing 
     } 
} 

フラグメント2:

public class YourFragment2 extends YourBaseFragment implements IBackHandler { 
     // your code 
     @Override 
     public boolean doBack() { 
      return false; //this means: call 'super.onBackPressed()' 
     } 
} 

あなたの活動を:

public class YourActivity extends YourBaseActivity { 
    //your code 
    @Override 
    public void onBackPressed() { 
     Fragment currentFragment = getFragmentManager().findFragmentById(R.id.yourFragment); 
    if (currentFragment instanceof IBackHandler) { 
     if (!((IBackHandler) currentFragment).doBack()) { 
      super.onBackPressed(); 
     } 
    } else 
     super.onBackPressed(); 
    } 
} 

あなたはこれが大胆であると思うかもしれませんが、私はこのようにしてあなたの流れの中で何が起きているかを常に制御できることを心から安心できます。

このヘルプが必要です。

0

変更フラグメントたとき、私はこのコードこの問題の使用を解く:

String fragmentIndexString="fragmenttwo";//or fragmentone something 
transaction.addToBackStack(); 

これは活動の完全なコードです:あなたがしたい場所へ

FirstFragment firstFragment; // my first fragment 
SecondFragment secondFragment; // my second fragment 
public static String FIRST="asfasgasg"; //first fragment index 
public static String SECOND="gsadgsagd"; //second fragment index 
... 
/* u can change fragment by using setFragment funiction */ 
public void setFragment(String page){ 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    switch (page){ 
     case FIRST: 
      if(firstFragment==null) firstFragment= SettingFragment.newInstance(); 
      if (!firstFragment.isAdded()) { 
       transaction.replace(R.id.fragmentcontainer, firstFragment); 
       transaction.addToBackStack(INDEX); 
       transaction.commit(); 
      } else { 
       transaction.show(firstFragment); 
      } 
      break; 
     case SECOND: 
      if(secondFragment==null) secondFragment= SettingFragment.newInstance(); 
      if (!secondFragment.isAdded()) { 
       transaction.replace(R.id.fragmentcontainer, secondFragment); 
       transaction.addToBackStack(INDEX); 
       transaction.commit(); 
      } else { 
       transaction.show(secondFragment); 
      } 
      break; 
     default: 
      setFragment(INDEX); 
    } 
} 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){ 
     if(fragmentManager.getBackStackEntryCount()>1){ 
      fragmentManager.popBackStack(); 
      return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

こんにちは、お返事ありがとうございます。私がフラグメント1からフラグメント2に変わるとき、私はこのコードを持っています:フラグメント=新しいMaterialesFragment(); FragmentManager fragmentManager3 = getFragmentManager(); fragmentManager3.beginTransaction()。replace(R.id.frame、fragment).addToBackStack( "tagMateriales")。commit(); –

関連する問題