switch - android toolbar tabs



Programmgesteuertes Festlegen der ActionBarTab-Hintergrundfarbe mit der Farbe der Registerkarten-Auswahlfarbe unten mit der von Ihnen gewählten Farbe in ActionBarTab? (2)

Ich möchte die Hintergrundfarbe meiner ActionBar-Tabs ändern, indem Sie die Tabs-Auswahlleiste in der unteren Farbe verwenden.

Ich möchte das mit Java-Code nicht XML.

Ich habe versucht, ActionBar Tabs zu erstellen.

actionBar = getActionBar();


// Hide the action bar title
           ActionBar actionBar.setDisplayShowTitleEnabled(false);

        // Enabling Spinner dropdown navigation
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

         ActionBar.Tab PlayerTab = actionBar.newTab().setText("Fragment A");
          ActionBar.Tab StationsTab = actionBar.newTab().setText("Fragment B");

          //create the two fragments we want to use for display content
         //////////////////////// Fragment PlayerFragment = new AFragment();
         /////////////////// Fragment StationsFragment = new BFragment();

          //set the Tab listener. Now we can listen for clicks.
          ///////////////////PlayerTab.setTabListener(new MyTabsListener(PlayerFragment));
         ///////////////// ////StationsTab.setTabListener(new MyTabsListener(StationsFragment));

          //add the two tabs to the actionbar
          actionBar.addTab(PlayerTab);
          actionBar.addTab(StationsTab);

Jetzt, wenn ich versuche, Hintergrundfarbe mit Tabs Line Selector Farbe zu setzen, bekomme ich den Fehler Java.lang.NullPointException

Meine OnTabSelcted () Methode ..

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
RelativeLayout tabLayout = (RelativeLayout) tab.getCustomView();

//tab.setCustomView(getResources().getDrawable(R.drawable.tabs_selector_blue));

     System.out.println("Tab position is " +tab.getPosition());
     try{
     if(tab.getCustomView() == null){

tabLayout.setBackgroundResource(TABS_BACKGROUND[tab.getPosition()]);
         tab.setCustomView(tabLayout);
     }else{
         Toast.makeText(getApplicationContext(), "check for tabs", Toast.LENGTH_SHORT).show();
     }
     }catch(Exception e){
         e.printStackTrace();
     }

}

Ich habe einen benutzerdefinierten Selektor für den Hintergrund definiert und muss ihn aufblasen.

Ich tabLayout.setBackgroundResource(TABS_BACKGROUND[tab.getPosition()]); in die Zeile tabLayout.setBackgroundResource(TABS_BACKGROUND[tab.getPosition()]);

Bitte lass mich zeigen, wo mein Fehler ist.

https://src-bin.com


Answer #1

Siehe die Aussage

RelativeLayout tabLayout = (RelativeLayout) tab.getCustomView();

und if Bedingung

if(tab.getCustomView() == null){
     tabLayout.setBackgroundResource(TABS_BACKGROUND[tab.getPosition()]);
     tab.setCustomView(tabLayout);
}

Wenn nun tab.getCustomView() null zurückgibt, ist tabLayout ebenfalls null und die if Bedingung wird true . und innerhalb der Bedingung verweisen Sie auf tabLayout das null ...


Answer #2

Ich sehe, du benutzt meine Lösung . Ihr tabLayout möglicherweise null, wenn Sie es beim Erstellen von Tabs nicht initialisiert haben. Hier ist der Code, den ich verwendet habe, um Tabs zu erstellen, bevor ich den Hintergrund und die onTabSelected in onTabSelected

for (int i = 0; i < TABS.length; i++) {
    Tab tab = actionBar.newTab();
    tab.setText(TABS[i]);
    tab.setTabListener(this);
    tab.setCustomView(getTabView(i));  << see getTabView() method below  
    actionBar.addTab(tab, i, (currentTab == i));
}

getTabView () Methode:

private View getTabView(int i) {
    // TODO Auto-generated method stub
    RelativeLayout r = (RelativeLayout) getLayoutInflater().inflate(
            R.layout.custom_tab, null);
    TextView t = (TextView) r.findViewById(R.id.custom_tab_text);
    t.setText(TABS[i]);
    int color;
    switch (i) {
    case MyObject.TYPE_A:
        color = MyObject.COLOR_A;
        break;
    case MyObject.TYPE_B:
        color = MyObject.B;
        break;
    case MyObject.TYPE_C:
        color = MyObject.COLOR_C;
        break;
    case MyObject.TYPE_E:
        color = MyObject.COLOR_E;
        break;
    case MyObject.TYPE_F:
        color = MyObject.COLOR_F;
        break;
    default:
        color = MyObject.COLOR_A;
        break;
    }

    t.setTextColor(color);
    return r;
}

Schließlich custom_tab.xml , das Layout der Registerkarten:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="0dp"
    android:layout_margin="0dp">

    <TextView
        android:id="@+id/custom_tab_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:layout_centerInParent="true"
        android:layout_centerHorizontal="true"
        android:gravity="center|center_horizontal"
        android:textStyle="bold"/>

</RelativeLayout>




android-actionbar