2017-09-06 14 views
0

タブをクリックすると、現在のタブの下部に重複したカスタムアイコンが作成されます。これを取り除く方法は?AndroidのtabLayoutの重複タブ

私はコードの下に使用してカスタムタイトルを設定しています:

private void setIcon(String title, int icon, boolean isSelected, int position) { 

     LinearLayout tab = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.custom_tab, null); 
     TextView tabTitle = (TextView) tab.findViewById(R.id.tab_title); 
     final CircleImageView tabImage = (CircleImageView) tab.findViewById(R.id.tab_image); 

     if (isSelected){ 
      //add shadow to image. 
      tabImage.setBorderColor(ContextCompat.getColor(getActivity(),R.color.white)); 
      tabImage.setBorderWidth(10); 
     } 

     Glide.with(getContext()).load(icon).into(tabImage); 

     tabTitle.setText(title); 
     tabLayout.getTabAt(position).setCustomView(tab); 
    } 

私がやろうとしています何: ユーザーがタブをクリックすると、画像の外の境界線を追加します。だから私は以下のようにtablayoutにaddTabSelectedListenerを追加していこれを行うには:

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 

       //add shadow on selected tab 
       setIcon(getTitle(tab.getPosition()), getIcon(tab.getPosition()),true,tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

       //remove shadow from previous tab 
       setIcon(getTitle(tab.getPosition()), getIcon(tab.getPosition()),false,tab.getPosition()); 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 


      } 
     }); 

しかし、新しいタブのアイコンはだけではなく、古いアイコンを置き換えるの古いアイコンの下に追加されます。私が試してみました何

  1. tabLayout.removeTab(タブ)tabLayout.removeTabAtの
  2. 使用の使用(tab.getpostion());
  3. tabLayout.removeAllTabs()の使用。

これらはすべてNullPointerExceptionになります。

編集:

Arpanが示唆したように:

ビュービュー= tab.getCustomViewを(); このビューからtabTitleとtabImageはどのように取得されますか?

編集2:

[OK]を、私は一部正しいすなわち、画像が正しくロードされますが、タイトルは以下の一番上に移動する代わりにされて行うことができると思います。

コード:私はこれを行う場合は

LinearLayout customTab = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.custom_tab, null); 
       final CircleImageView tabImage = (CircleImageView) tab.getCustomView().findViewById(R.id.tab_image); 
       final TextView tabTitle = (TextView) tab.getCustomView().findViewById(R.id.tab_title); 

       tabTitle.setText(getTitle(tab.getPosition())); 



       Glide.with(getContext()).load(getIcon(tab.getPosition())).into(tabImage); 

       tab.setCustomView(tabImage); 

、画像が完全に設定されていますが、タイトルはそれの上に行きます。タブ内にtabTitleを設定していないためです。どうすればいいの?

リニアレイアウトを使用し、それを設定するより重複タブを作成する場合。

編集3:すべてが終わっ

、私はちょうどtabtitleためsetcustomViewAgainを呼び出します。

答えて

0

AFAIK毎回setIcon()メソッドでは、タブビューの新しいインスタンスを作成しています。これは問題のようです。あなたがすべきことは、タブリスナーからビューを渡し、それをIconに設定する必要があるということです。

Yousはタブを通過する必要があります。 getCustomView()をご覧になり、setIcon()機能を使用して、そのビューからtabTitletabImageを取得してください。

あなたのTextViewを取得するためのEDIT あなたは、タブビューの新しいインスタンスを作成している

tvTitle = (TextView)tab.getCustomView().findViewById(R.id.tab_title); 
+0

setIcon()メソッドを実行する必要があります。これは、tabLayout.getTabAt(position).setCustomView(tab);です。新しいインスタンスを作成する???そのビューからtabTitleとtabImageをどのように取得しますか? –

+0

これはタブが保持しているビューです。試してみましたか? –

+0

更新された答えを見て –

関連する問題