2016-11-02 7 views
0

1つのコンテナビューエレメントに異なるフラグメントをロードできるアクティビティを実装しようとしています。私はBuilding a Flexible UI Trainingに従います。問題:フラグメントを置き換えるときに、置き換えられたフラグメントをバックグラウンドで引き続き見ることができます。置き換えられたフラグメントはまだ新しいフラグメントの後ろに表示されます

私の質問は何度も尋ねられています。しかし、私が見つけたすべての答えはちょうど回避策(断片の背景色を設定する)か適用されないようです。ここで

は、私がこれまでのセットアップを持っているものです。

活動のXMLレイアウトがフラグメントのコンテナとして1でframeLayoutが含まれています

<FrameLayout 
    android:id="@+id/fragment_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

ID fragment_containerがプロジェクトに他のどこにも使用されています。

最初のフラグメントの完全なXMLレイアウト:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:text="First Fragment" /> 

第2のフラグメントの完全なXMLレイアウト:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:textColor="#ff0000" 
    android:text="Fragment Second" /> 

最初のフラグメントのクラスファイルは、第二のために、この(クラスのように見えますフラグメント類似):

public class FirstFragment extends Fragment { 

    public FirstFragment() {} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_first, container, false); 
    } 

} 

アクティビティのonCreateメソッドでは、最初のfr agment:

getFragmentManager().beginTransaction() 
     .replace(R.id.fragment_container, new SecondFragment()) 
     .addToBackStack(null) // <-- does not make any difference if left out 
     .commit(); 

結果は、テキスト「フラグメントセカンド:

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

    // load first fragment 
    if (savedInstanceState == null) { 
     getSupportFragmentManager().beginTransaction() 
       .add(R.id.fragment_container, new FirstFragment()) 
       .commit(); 
    } 
} 

は私が活動の onOptionsItemSelected方法でこのコードの第2のフラグメントで最初のフラグメントを交換しようとするメニュー項目を選択"がテキスト" First Fragment "の上に赤色で印刷されています。

この問題を解決するための「正しい方法」(背景色を設定するだけではない)は何ですか?

答えて

2

私はonCreateでこれを気づいた:onOptionsItemSelected

 getSupportFragmentManager() 

と、この:

 getFragmentManager() 

FragmentManagerの両方のバージョンはAppCompatActivityに実際に存在すると、彼らはお互いについて何も知りません。だからandroid.app.FragmentManagerandroid.support.v4.app.FragmentManagerで追加されたフラグメントを置き換えると言うと、それはFirstFragmentについては何も知らないので、操作は置換よりも多くのように機能します。

私はこのミスを複数回繰り返しました。コードを徹底的に調べて、サポートクラスと通常クラスの一貫性を確認する必要があります。

+0

ありがとうございました!それだった! –

+0

あなたは 'onOptionsItemSelected'がアクティビティに属していると言いました。フラグメントでは、通常のフラグメントは通常の 'FragmentManager'のみを知っているため、' getFragmentManager() 'は常に正しいことを行い、サポートフラグメントはサポートされているフラグメントについてしか知りません。もしそれがアクティビティの 'onOptionsItemSelected'であると言わなかったなら、私はフラグメントから呼び出すと仮定していましたが、これは問題がないでしょう。 –

関連する問題