TabLayout-Update-Tab-Inhalt mit einer benutzerdefinierten Ansicht

Ich benutze TabLayout von der neuen Material-Design und ich habe ein Problem, ich kann nicht aktualisieren Register Inhalt einer benutzerdefinierten Ansicht, sobald die Registerkarte erstellt wird:

Ich kann meine Methode in meinem PagerAdapter mit vereinfachen

  • Debug native Code in Android Studio
  • Wie kann ich das GPS programmgesteuert auf Android aktivieren oder deaktivieren?
  • TaskStackBuilder.addParentStack funktioniert nicht, als ich eine Benachrichtigung baute
  • ADB antwortet nicht. Sie können mehr warten oder "adb.exe" Prozess manuell töten und klicken Sie auf "Neustart"
  • OpenID für Android Apps, die SignIn benötigen
  • Wo kann man Code für die Anwendung starten?
  •  public View setTabView(int position, boolean selected) { View v = LayoutInflater.from(context).inflate(R.layout.default_tab_view, null); tv = (TextView) v.findViewById(R.id.tabTextView); if(selected) tv.setText("SELECTED"); else tv.setText("UNSELECTED"); return v; } 

    Und in der Tätigkeit kann ich meinen Code mit:

     TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); ViewPager pager = (ViewPager) findViewById(R.id.viewpager); PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager()); pager.setAdapter(adapter); tabLayout.setupWithViewPager(pager); for (int i = 0; i < tabLayout.getTabCount(); i++) { TabLayout.Tab tab = tabLayout.getTabAt(i); View v; if (i == 0) { v = adapter.setTabView(i, true); v.setSelected(true); } else v = adapter.setTabView(i, false); tab.setCustomView(v); } tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { adapter.setTabView(tab.getPosition(), true); } @Override public void onTabUnselected(TabLayout.Tab tab) { adapter.setTabView(tab.getPosition(), false); } @Override public void onTabReselected(TabLayout.Tab tab) { } }); 

    Die Tabs-Titel sind richtig eingestellt, wenn die App startet, aber wenn ich die Registerkarte ändere, bleibt der Inhalt immer noch gleich.

  • Was macht Guice nicht in der Lage, auf Android zu laufen, außer als Guice-no-aop?
  • Google Mobile Vision Text API Beispiel
  • Android SQLite - was macht SQLiteDatabase.replace () eigentlich?
  • Android canvas entfernen vorherigen weg gezeichnet
  • Programmatisch gehen Sie zurück zum vorherigen Fragment im Backstack
  • NullPointerException bei TextView.checkForRelayout () während setText ()
  • 4 Solutions collect form web for “TabLayout-Update-Tab-Inhalt mit einer benutzerdefinierten Ansicht”

    Ok ich denke, es ist Bug auf Android-Design-Support-Bibliothek v22.

    Weil du über die Änderungen im Inhalt redest, aber ich kann die Farbe von Text nicht ändern. Sobald die Registerkarte erstellt ist und wenn Sie das Layout ändern, wird es nicht reflektieren.

    Und wie ich Ihren Code gesehen habe, geben Sie das benutzerdefinierte Layout mit setCustomView. Und zum Ändern eines Textes rufen Sie die Methode setTabView () erneut auf. Stattdessen sollte es Methode getCustomView () geben, damit du das Layout ändern kannst. Es gibt eine Methode in einem TabLayout.Tab.getCustomView aber es hat keine Kennung und ich habe diesen Bug gemeldet.

    https://code.google.com/p/android/issues/detail?id=177492

    [Update 08-07-2015]

    Schließlich wird Bug von android Bug Source Traking akzeptiert und als Future Release markiert. So können wir sagen, dass Bug nicht mehr auf zukünftiger Bibliothek existieren wird. Und wir können die Methode getCustomView() damit wir ganz einfach unsere benutzerdefinierte Ansicht bekommen können.

    [Update 18-08-2015]

    Schließlich ist der Fehler behoben. Freigegeben in der v23-Unterstützung libs . Nur aktualisieren Support-Bibliothek mit SDK-Manager und Sie haben getCustomView () als Öffentlichkeit.

    Ändere einfach diese Zeile in gradle

     compile 'com.android.support:design:23.0.0' 

    Und stellen Sie sicher, kompilieren und Ziel sdk auf 23 gesetzt.

    Bitte überprüfen Sie meinen Code für mich gut

     TabLayout.Tab tab=tabLayout.getTabAt(position); View view=tab.getCustomView(); TextView txtCount= (TextView) view.findViewById(R.id.txtCount); txtCount.setText(count+""); 

    Okay, ich hätte vielleicht eine sehr knifflige Lösung gefunden, nur weil ich keine Zeit hatte, auf die nächste Support-Bibliothek zu warten. Hier ist was ich tat:

    1. Setzen Sie den Pager-Adapter auf Ihren TabLayout- tabLayout.setTabsFromPagerAdapter(pagerAdapter);
    2. Hinzufügen von Zuhörer zu Ihrem ViewPager

        customViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { tabLayout.getTabAt(position).select(); } @Override public void onPageScrollStateChanged(int state) { } }); 
    3. Füge Listener dein TabLayout hinzu

       tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { if (!isTabUpdating) { isTabUpdating = true; final int pos = tab.getPosition(); customViewPager.setCurrentItem(pos); // Clears and populates all tabs tabLayout.setTabsFromPagerAdapter(pagerAdapter); invalidateTabs(pos); } } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { if (!isTabUpdating) { isTabUpdating = true; final int pos = tab.getPosition(); customViewPager.setCurrentItem(pos); // Clears and populates all tabs tabLayout.setTabsFromPagerAdapter(pagerAdapter); invalidateTabs(pos); } } }); 
    4. Hinzufügen einer Methode zum erneuten Zeichnen aller Registerkarten

       private void invalidateTabs(int selected) { for (int i = 0; i < tabLayout.getTabCount(); i++) { tabLayout.getTabAt(i).setCustomView(pagerAdapter.getTabView(i, i == selected)); } isTabUpdating = false; } 

    Ok, so lass mich erklären, ein wenig wissen Zuerst fragen Sie sich vielleicht, warum habe ich setTabsFromPagerAdapter() anstelle von setupWithViewPager . Am Anfang habe ich setupWithViewPager aber irgendwie habe ich es nicht richtig mit meinem Pager gearbeitet und das 1. Item konnte nicht ausgewählt werden.

    Die zweite Sache, die du zugeben möchtest – jedes Mal, wenn ich einen Tab wähle, löse ich alle. Nun, das war ein Tab.setCustomView(View) einfaches Problem, du siehst, dass ich Android-Quellen, wenn du Tab.setCustomView(View) , überprüft es das Elternteil der Ansicht und wenn es nicht null ist, entfernt es alle childviews. Allerdings, wenn Sie neu-instanziierten Artikel passieren, werden Sie eine andere Ansicht hinzufügen, anstatt das alte zu ersetzen:

      View custom = tab.getCustomView(); if(custom != null) { ViewParent icon = custom.getParent(); if(icon != this) { if(icon != null) { // You wont get here ((ViewGroup)icon).removeView(custom); } this.addView(custom); } ... 

    Also, ich landete mit der Einstellung aller Zuhörer von mir und neu erstellen alle Registerkarten jedes Mal auf Seite / Registerkarte Änderungen. Das ist NICHT gute Lösung, aber soweit es nicht warten kann, bis Google ihre lib aktualisiert hat – das ist wohl die einzige Lösung, um diese Wirkung zu erzielen. (Nur für den Fall, dass Sie sich fragen, warum dies so kompliziert ist – ich brauchte Tabs mit benutzerdefinierten Ansichten (Text + Bild), die ihre Ansicht-Eigenschaften (Schriftfarbe, Bild) ändern könnte, wenn sie ausgewählt / nicht ausgewählt sind)

    BTW – Hier ist die getTabView(...) Methode aus dem 4. Schritt:

     public View getTabView(int pos, boolean isSeleted) { View tabview = ((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout .tab_sessioninfo, null, false); final ImageView ivTabIcon = (ImageView) tabview.findViewById(R.id.iv_tab_icon); final TextView tvTabTittle = (TextView) tabview.findViewById(R.id.tv_tab_title); if (isSeleted) { tvTabTittle.setTextColor(context.getResources().getColor(R.color.tab_indicator)); } switch (pos) { case 0: tvTabTittle.setText("1st Tab"); ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon1_selected : R.drawable.ic_icon1); break; case 1: tvTabTittle.setText("2nd Tab"); ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon2_selected : R.drawable.ic_icon2); break; case 2: tvTabTittle.setText("3rd Tab"); ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon3_selected : R.drawable.ic_icon3); break; } return tabview; } 

    PS Wenn Sie eine bessere Lösung für all dieses Zeug kennen, lassen Sie mich wissen!

    AKTUALISIEREN

    Eine bessere Lösung könnte durch Reflexion erreicht werden:

    1. Einfache Einstellung

       tabLayout.setupWithViewPager(customViewPager); customViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { for (int i = 0; i <tabLayout.getTabCount(); i++){ updateTab(tabLayout.getTabAt(i), position == i); } } @Override public void onPageScrollStateChanged(int state) { } }); 
    2. Tab aktualisieren

       private void updateTab(TabLayout.Tab tab, boolean isSelected){ Method method = null; try { method = TabLayout.Tab.class.getDeclaredMethod("getCustomView", null); method.setAccessible(true); View tabview = (View) method.invoke(tab, null); final ImageView ivTabIcon = (ImageView) tabview.findViewById(R.id.iv_tab_icon); final TextView tvTabTittle = (TextView) tabview.findViewById(R.id.tv_tab_title); if (isSeleted) { tvTabTittle.setTextColor(context.getResources().getColor(R.color.tab_indicator)); } switch (pos) { case 0: tvTabTittle.setText("1st Tab"); ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon1_selected : R.drawable.ic_icon1); break; case 1: tvTabTittle.setText("2nd Tab"); ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon2_selected : R.drawable.ic_icon2); break; case 2: tvTabTittle.setText("3rd Tab"); ivTabIcon.setImageResource(isSeleted ? R.drawable.ic_icon3_selected : R.drawable.ic_icon3); break; } tab.setCustomView(tabview); } catch (Exception e) { e.printStackTrace(); } } 

    AKTUALISIEREN

    Neue Unterstützungsbibliothek hat öffentliche Methode für getCustomView() , also brauchst du keine Reflexion mehr!

    Bitte überprüfen Sie meinen Code für mich gut

     TabLayout.Tab tab=tabLayout.getTabAt(position); View view=tab.getCustomView(); TextView txtCount= (TextView) view.findViewById(R.id.txtCount); txtCount.setText(count+""); 

    Schauen Sie sich die Antwort an, die Sie benötigen, um das Layout so zu setzen, wie es von Ihnen erwartet wird. Wenn du den Tab Content ändern willst, dann ändere ich in Tab.setOnTabSelectedListener ()

     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { if(tab.getPosition()==1){ tabLayout.setTabTextColors(ContextCompat.getColor(getActivity(), R.color.unselected_tab),ContextCompat.getColor(getActivity(), R.color.tab_selection)); }else{ tabLayout.setTabTextColors(ContextCompat.getColor(getActivity(), R.color.unselected_tab),ContextCompat.getColor(getActivity(), R.color.white)); } // same thing goes with other tabs too // Just change your tab text on selected/deselected as above } @Override public void onTabUnselected(TabLayout.Tab tab) { tab.setCustomView(null); } @Override public void onTabReselected(TabLayout.Tab tab) { } }); 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.