2016-08-15 16 views
1

私はTabLayoutの3つのフラグメントを最初のタブに持っています。条件に応じて2つのフラグメントを切り替える必要がありますが、if文を使用しますが、フラグメントは切り替えられません最初の断片。以下のケースシナリオと何をしているのかのコードスニペットです。再読み込みアクティビティのフラグメント間の再切り替え

MYアプリでは、最初に使用するかどうかを決めることができます。主なアクティビティはランチャーです。メインアクティビティの(TabLayoutと3つのFragmentを含む)ユーザがログインしているかどうかを確認します。

if (user != login) { 
    load fragment A 
}else{ 
    load fragment B 
} 

私は、ユーザーがログインボタンをクリックした場合、それはユーザーがログインしていると、フラグメントがまだ保持、ログインするユーザーのためのfragementをロードし、アプリを使用しながら、どこかにユーザーがログインできるオプションがあり ログインしていないユーザーの状態、つまりまだ読み込んでいます。フラグメントAですが、アプリ内のすべてのユーザーログインの詳細が表示されます。

この時点では、ユーザーがログインするかしないチェックするSharedPreferencesを使用する必要があり、まだ

@Override 
public Fragment getItem(int position) { 
    Fragment f; 
    switch (position) { 
     case NEWS_POST: 
      if(fbid != null){ 
       f = new NewsFragment(); 
      }else{ 
       f = new NewsAllFragment(); 
      } 
+0

を拡張していることを確認してください詳細を提供してください、あなたの問題は –

+0

は、もう少しコードを追加不完全である、あなたは '/追加するために' FragmentManager'を使用している部分が現在のreplace' 「断片」。 'NewsFragment'と' NewsAllFragment'を初期化するところにブレークポイントを追加して、実際に呼び出されているかどうかを確認してください。 – Abbas

+0

ユーザがログインしているかどうかを知りたいかどうかを確認するには、loggedIn論理値またはいくつかのキーを優先的に保存する必要があります。 – Eenvincible

答えて

0

まず

if (user != login) { 
    load fragment A 
} 

コードスニペットアクティブです。

また、フラグメント内でこのコードを使用して、このフラグメントが表示されているかどうかを確認することができます。表示されている場合は、共有プリファレンスからブールログイン情報を取得するために必要なタスクを実行できます。

ここ
private static boolean m_iAmVisible; 

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    m_iAmVisible = isVisibleToUser; 

    if (m_iAmVisible) { 
     Log.d(localTAG, "this fragment is now visible"); 
    } else { 
     Log.d(localTAG, "this fragment is now invisible"); 
    } 
} 

この中onCreateView方法で

final View x = inflater.inflate(R.layout.consumer_tab_layout, null); 
     tabLayout = (TabLayout) x.findViewById(R.id.tabs); 
     viewpager_for_tabs = (ViewPager) x.findViewById(R.id.viewpager_for_tabs); 


     bottom_tv1 = (TextView) x.findViewById(R.id.bottom_tv1); 
     bottom_tv2 = (TextView) x.findViewById(R.id.bottom_tv2); 
     bottom_tv3 = (TextView) x.findViewById(R.id.bottom_tv3); 
     bottom_tv4 = (TextView) x.findViewById(R.id.bottom_tv4); 
     bottom_tv5 = (TextView) x.findViewById(R.id.bottom_tv5); 

     /** 
     *Set an Apater for the View Pager 
     */ 
     viewpager_for_tabs.setAdapter(new MyAdapter(getChildFragmentManager())); 
     viewpager_for_tabs.setOffscreenPageLimit(5); 

     /** 
     * Now , this is a workaround , 
     * The setupWithViewPager dose't works without the runnable . 
     * Maybe a Support Library Bug . 
     */ 

     viewpager_for_tabs.setOnPageChangeListener(myOnPageChangeListener); 
     bottom_tv1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv1, R.drawable.d1); 
       viewpager_for_tabs.setCurrentItem(0, false); 
      } 
     }); 
     bottom_tv2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv2, R.drawable.d2); 
       viewpager_for_tabs.setCurrentItem(1, false); 
      } 
     }); 
     bottom_tv3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv3, R.drawable.d3); 
       viewpager_for_tabs.setCurrentItem(2, false); 
      } 
     }); 
     bottom_tv4.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv4, R.drawable.d4); 
       viewpager_for_tabs.setCurrentItem(3, false); 
      } 
     }); 
     bottom_tv5.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateBottomTabTextViews(bottom_tv5, R.drawable.d5); 
       viewpager_for_tabs.setCurrentItem(4, false); 
      } 
     }); 

     tabLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       tabLayout.setupWithViewPager(viewpager_for_tabs); 


      } 
     }); 

     return x; 

とアダプタのGetItemメソッドで

@Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
         return new fragment(); 

       case 1: 
        return frag2.getInstance(); 
       case 2: 
        return frag3.getInstance(); 
       case 3: 
        return frag4.getInstance(); 
       case 4: 
        return frag5.getInstance(); 
      } 
      return null; 
     } 

、私はviewPagerを使用していた中でのフラグメントを持って見る私は実用的に持っていました。ビューのperformClick()メソッドを使用してButton onClickを呼び出すと、自動的にフラグメントを置き換えます。

より良い解決策はviewPagerの現在の項目を変更することですあなたがviewPagerの単一のタブ上の異なるフラグメントを表示したい場合は、このソリューションpager.setCurrentItem(num)

を見て、その後(のgetItemsでブール条件を適用する)あなたのフラグメントの方法アダプタ。次にviewPager.setCurrentItem(int)関数を呼び出します。

は、あなたのフラグメントアダプタがFragmentStatePagerAdapterクラス

+0

ユーザが共有設定からログインしているかどうかを確認しています。アプリを使用していますが、アプリを使用している間は、ユーザーがログインしているときに最初の断片が残っています。これは本当に悪いユーザーエクスペリエンスです。 – SimpiMind

+0

ユーザーがログインして何らかの作業をしていることを確認するコードが必要です。そのコードでは、このようなフラグメントを置き換えることができますhttp://stackoverflow.com/a/18940937/6634982。あなたがビューページャーを使用している場合、setPage関数を使用している場合 –

+0

ユーザーがログインしているかどうかを確認するコードがあり、3つのタブを持つビューページャーを使用しています。最初のタブを2つの異なるフラグメントユーザーはログインしているかどうかを確認します。あなたはすでに問題があるという考えを持っているので、どうすれば解決できるのでしょうか?ありがとう。 – SimpiMind