Android entfernt Leerzeichen zwischen Tabs im Tabwidget

Lesezeit: 11 Minuten

Android entfernt Leerzeichen zwischen Tabs im Tabwidget
ReNa

Ich habe eine Anwendung erstellt, die Tabs wie in HelloTabActivity hat, es gibt auch Leerzeichen zwischen diesen Tabs, kann jemand vorschlagen, wie man dieses Leerzeichen entfernt, und es gibt auch eine graue Linie unter den Tabs, wie kann das entfernt werden?

Geben Sie hier die Bildbeschreibung ein

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TabHost
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp" >
        <HorizontalScrollView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scrollbars="none">
            <TabWidget
                android:id="@android:id/tabs"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" />
        </HorizontalScrollView>
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="5dp" />
    </LinearLayout>
</TabHost>
</LinearLayout>

styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomTheme" parent="@android:style/Theme">
    <item name="android:tabWidgetStyle">@style/CustomTabWidget</item>
</style>
<style name="CustomTabWidget" parent="@android:style/Widget.TabWidget">
    <item name="android:textAppearance">@style/CustomTabWidgetText</item>
</style>
<style name="CustomTabWidgetText" 
    parent="@android:style/TextAppearance.Widget.TabWidget">
    <item name="android:textSize">10sp</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textColor">#1589FF</item>
    <item name="android:padding">3dip</item>
</style>


</resources>

Aktivität

public class InfralineTabWidget extends TabActivity{

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Resources res = getResources(); // Resource object to get Drawables
    TabHost tabHost = (TabHost)getTabHost();  // The activity TabHost

    TabHost.TabSpec spec;  // Resusable TabSpec for each tab
    Intent intent;  // Reusable Intent for each tab

    // Create an Intent to launch an Activity for the tab (to be reused)
    intent = new Intent().setClass(this, TopNewsActivity.class);

    // Initialize a TabSpec for each tab and add it to the TabHost
    spec = tabHost.newTabSpec("topNews").setIndicator("Top News", res.getDrawable(R.drawable.tab_news)).setContent(intent);
    tabHost.addTab(spec);

    // Do the same for the other tabs
    intent = new Intent().setClass(this, PowerActivity.class);
    spec = tabHost.newTabSpec("power").setIndicator("Power", res.getDrawable(R.drawable.tab_power)).setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, EnergyActivity.class);
    spec = tabHost.newTabSpec("energy").setIndicator("Renewable Energy", res.getDrawable(R.drawable.tab_energy)).setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, CoalActivity.class);
    spec = tabHost.newTabSpec("coal").setIndicator("Coal", res.getDrawable(R.drawable.tab_coal)).setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, OilnGasActivity.class);
    spec = tabHost.newTabSpec("oilnGas").setIndicator("Oil & Gas", res.getDrawable(R.drawable.tab_oilngas)).setContent(intent);
    tabHost.addTab(spec);

    tabHost.setCurrentTab(0);
    tabHost.getTabWidget().getChildAt(0).setLayoutParams(new LinearLayout.LayoutParams(100,25));
    tabHost.getTabWidget().getChildAt(1).setLayoutParams(new LinearLayout.LayoutParams(100,25));
    tabHost.getTabWidget().getChildAt(2).setLayoutParams(new LinearLayout.LayoutParams(100,25));
    tabHost.getTabWidget().getChildAt(3).setLayoutParams(new LinearLayout.LayoutParams(100,25));
    tabHost.getTabWidget().getChildAt(4).setLayoutParams(new LinearLayout.LayoutParams(100,25));



}



}

Jetzt möchte ich die schwarzen Leerzeichen zwischen den Registerkarten entfernen und es sollte so sein, als wären sie verbunden, und ich kann auch die graue Linie unter den Registerkarten nicht entfernen.

Danke

  • Bitte teilen Sie einige Screenshots zu Ihrem Problem und den von Ihnen verwendeten XML-Stilen / -Designs mit. Es kann vorkommen, dass Sie irgendwo einen globalen Trennzeichenstil festlegen (Layout-XML oder Code), und das stört Sie jetzt.

    – rekaszeru

    27. April 11 um 9:20 Uhr

  • @rekaszeru: Ich habe den Code eingefügt, bitte schauen Sie nach. 🙂

    – ReNa

    27. April 11 um 9:37 Uhr

Android entfernt Leerzeichen zwischen Tabs im Tabwidget
rekaszeru

Zum Entfernen der grauen Linie am unteren Rand Ihrer Tableiste können Sie festlegen

tabHost.getTabWidget().setStripEnabled(false);

Ab dem Entfernen der Lücke zwischen den Laschen. Am besten verwenden Sie Ihr eigenes Drawable ohne Polsterung. Sie können dafür Bilder verwenden oder Sie können die Hintergründe Ihrer Registerkarten über XML erstellen, z. B. in a <layer_list> Wurzelelement:

<layer_list>
    <item android:top="0dp" android:left="0dp" android:right="0dp" android:bottom="0dp">
        <shape android:shape="rectangle">
        [..]
        </shape>
    </item>
    [..]
</layer_list>

und stellen Sie dieses Drawable als Hintergrund für Ihr ein TabWidget.

Um zu sehen, wie Sie Ihre Registerkarten anpassen können, gibt es viele Tutorials im Internet. Beispielsweise dieses von Josh ist kurz und hat eine schöne Erklärung.

Aktualisieren

Hier teile ich ein kleines Beispiel für ein Tabwidget mit benutzerdefinierten Registerkarten (basierend auf Ihrem Code), um die folgende Ausgabe zu erzielen:

benutzerdefinierte Registerkarten

Was du brauchst:

  1. drei neue Layer Drawables (für ausgewählte, fokussierte und nicht ausgewählte Zustände der Registerkarten)
  2. Zwei State Drawables (für den Text und Hintergrund der verschiedenen Zustände)
  3. ein neues Layout für die Registerkarten
  4. aktualisieren Sie Ihre main.xml
  5. Aktualisieren Sie Ihre Aktivitätsklasse
  6. aktualisiere deine androidManifest.xml (entferne die Stildeklarationen)

Die Drawables mit drei Ebenen: tab_normal.xml, tab_focused.xml, tab_selected.xml
drawable/tab_normal.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/default_back_color" />
        </shape>
    </item>
    <item android:top="2dp">
        <shape android:shape="rectangle">
            <gradient android:startColor="#AAAAAA" android:centerColor="#888888"
                android:endColor="#666666" android:angle="90" />
            <corners android:bottomRightRadius="0dp"
                android:bottomLeftRadius="0dp" android:topLeftRadius="10dp"
                android:topRightRadius="10dp" />
        </shape>
    </item>
    <item android:top="4dp" android:left="1dp" android:right="1dp"
        android:bottom="0dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/default_back_color" />
            <corners android:bottomRightRadius="0dp"
                android:bottomLeftRadius="0dp" android:topLeftRadius="8dp"
                android:topRightRadius="8dp" />
        </shape>
    </item>
</layer-list>

drawable/tab_focused.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/default_back_color" />
        </shape>
    </item>
    <item android:top="2dp">
        <shape android:shape="rectangle">
            <gradient android:startColor="#AAAAAA" android:centerColor="#888888"
                android:endColor="#666666" android:angle="90" />
            <corners android:bottomRightRadius="0dp"
                android:bottomLeftRadius="0dp" android:topLeftRadius="10dp"
                android:topRightRadius="10dp" />
        </shape>
    </item>
    <item android:top="4dp" android:left="1dp" android:right="1dp"
        android:bottom="0dp">
        <shape android:shape="rectangle">
            <gradient android:startColor="#8F8F8F" android:centerColor="#656565"
                android:endColor="#3F3F3F" android:angle="90" />
            <corners android:bottomRightRadius="0dp"
                android:bottomLeftRadius="0dp" android:topLeftRadius="8dp"
                android:topRightRadius="8dp" />
        </shape>
    </item>
</layer-list>

drawable/tab_selektiert.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/default_back_color" />
        </shape>
    </item>
    <item android:top="2dp">
        <shape android:shape="rectangle">
            <gradient android:startColor="#EEEEEE" android:centerColor="#CCCCCC"
                android:endColor="#AAAAAA" android:angle="-90" />
            <corners android:bottomRightRadius="0dp"
                android:bottomLeftRadius="0dp" android:topLeftRadius="10dp"
                android:topRightRadius="10dp" />
        </shape>
    </item>
    <item android:top="4dp" android:left="1dp" android:right="1dp"
        android:bottom="0dp">
        <shape android:shape="rectangle">
            <gradient android:startColor="#EAEAEA" android:centerColor="#9F9F9F"
                android:endColor="#696969" android:angle="90" />
            <corners android:bottomRightRadius="0dp"
                android:bottomLeftRadius="0dp" android:topLeftRadius="8dp"
                android:topRightRadius="8dp" />
        </shape>
    </item>
</layer-list>

Die zwei Status Drawables: tab_background_selector.xml, tab_text_selector.xml
drawable/tab_background_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:state_focused="false"
        android:state_pressed="false" android:drawable="@drawable/tab_selected"/>
    <item android:state_selected="false" android:state_focused="false"
        android:state_pressed="false" android:drawable="@drawable/tab_normal" />
    <item android:state_pressed="true" android:drawable="@drawable/tab_focused"/>
    <item android:state_focused="true" android:state_selected="true"
        android:state_pressed="false" android:drawable="@drawable/tab_selected"/>
</selector>

drawable/tab_text_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="#1589FF" />
    <item android:state_focused="true" android:color="#1589FF" />
    <item android:state_pressed="true" android:color="@android:color/white" />
    <item android:color="#F0F0F0" />
</selector>

Das neue Layout für die Registerkarten: tab.xml
layout/tab.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:background="@drawable/tab_background_selector" android:gravity="center"
    android:orientation="vertical" android:padding="5dp">
    <ImageView android:id="@+id/tab_icon" android:layout_width="30dp"
        android:layout_height="30dp" android:scaleType="fitCenter" />
    <TextView android:id="@+id/tab_text" android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:singleLine="true"
        android:textStyle="bold" android:gravity="center_horizontal"
        android:textSize="10sp" android:padding="3dip" android:ellipsize="marquee"
        android:textColor="@drawable/tab_text_selector" />
</LinearLayout>

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TabHost android:id="@android:id/tabhost" android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <LinearLayout android:orientation="vertical"
            android:layout_width="fill_parent" android:layout_height="fill_parent">
            <HorizontalScrollView android:scrollbars="none"
                android:layout_width="fill_parent" android:layout_height="wrap_content">
                <TabWidget android:id="@android:id/tabs" 
                    android:layout_width="fill_parent" android:layout_height="wrap_content" />
            </HorizontalScrollView>
            <FrameLayout android:id="@android:id/tabcontent"
                android:layout_width="fill_parent" android:layout_height="fill_parent"
                android:padding="5dp" />
        </LinearLayout>
    </TabHost>
</LinearLayout>

InfralineTabWidget.java:

public class InfralineTabWidget extends TabActivity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final TabHost tabHost = (TabHost) getTabHost();

        tabHost.addTab(createTab(TopNewsActivity.class, 
                "topNews", "Top News", R.drawable.tab_news));
        tabHost.addTab(createTab(PowerActivity.class, 
                "power", "Power", R.drawable.tab_power));
        tabHost.addTab(createTab(EnergyActivity.class, 
                "energy", "Renewable Energy", R.drawable.tab_energy));
        tabHost.addTab(createTab(CoalActivity.class, 
                "coal", "Coal", R.drawable.tab_coal));
        tabHost.addTab(createTab(OilnGasActivity.class, 
                "oilnGas", "Oil & Gas", R.drawable.tab_oilngas));

        tabHost.setCurrentTab(0);
        tabHost.getTabWidget().getChildAt(0).getLayoutParams().width = 140;
        tabHost.getTabWidget().getChildAt(1).getLayoutParams().width = 140;
        tabHost.getTabWidget().getChildAt(2).getLayoutParams().width = 140;
        tabHost.getTabWidget().getChildAt(3).getLayoutParams().width = 140;
        tabHost.getTabWidget().getChildAt(4).getLayoutParams().width = 140;
    }

    private TabSpec createTab(final Class<?> intentClass, final String tag, 
            final String title, final int drawable)
    {
        final Intent intent = new Intent().setClass(this, intentClass);

        final View tab = LayoutInflater.from(getTabHost().getContext()).
            inflate(R.layout.tab, null);
        ((TextView)tab.findViewById(R.id.tab_text)).setText(title);
        ((ImageView)tab.findViewById(R.id.tab_icon)).setImageResource(drawable);

        return getTabHost().newTabSpec(tag).setIndicator(tab).setContent(intent);
    }
}

Und das ist es.
Um Registerkarten mit geraden Ecken zu erstellen, verlieren Sie einfach die Eckenspezifikationen aus den zeichbaren XML-Dateien der Ebene.
Spielen Sie auch mit den Farben, Strichen usw. herum, um das Ergebnis Ihren Vorlieben anzupassen.

  • Ich habe es nicht, können Sie das bitte näher erläutern

    – ReNa

    27. April 11 um 14:27 Uhr

  • In meinem Update finden Sie ein funktionierendes Beispiel für benutzerdefinierte Registerkarten. Spielen Sie mit den „Rändern“, Strichen, Farben und Ecken, damit sie so aussehen, wie Sie es möchten.

    – rekaszeru

    27. April 11 um 18:11 Uhr

  • Es scheint lächerlich, all dies durchgehen zu müssen, um einfach den Hintergrund zu ändern, der auf den Registerkarten basierend auf dem Status gezeichnet werden kann … großartiger Code

    – JondavidJohn

    29. Juni 11 um 14:43 Uhr


  • Hallo @rekaszeru, wie kann ich für jede Registerkarte eine andere Farbe anwenden? Bitte helfen Sie

    – Erma Isabel

    24. Januar 14 um 08:38 Uhr

  • @rekaszeru Ist das möglich? Oder muss ich für jede Registerkarte separate XMLs festlegen?

    – Erma Isabel

    24. Januar 14 um 12:03 Uhr

Verwenden Sie android:showDividers=”none” im XML-Layout.

<TabWidget
        android:id="@android:id/tabs"
        android:layout_width="fill_parent"
        android:showDividers="none"
        android:layout_height="wrap_content"/>

Wenn Ihr Build-Ziel Honeycomb oder höher ist, können Sie den folgenden Code verwenden.

if (Integer.parseInt(Build.VERSION.SDK) >= Build.VERSION_CODES.HONEYCOMB) {
    tabHost.getTabWidget().setShowDividers(LinearLayout.SHOW_DIVIDER_NONE);
}

Um die überschüssige Lücke zwischen den Tabs zu entfernen, kann man das Attribut measureWithLargestChild auf tabwidget auf false setzen

<TabWidget
   android:id="@android:id/tabs"                    
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:measureWithLargestChild="false">
 </TabWidget>

Eine magische Linie.

mTabHost.getTabWidget().setDividerDrawable(null);

Fertig

.

726390cookie-checkAndroid entfernt Leerzeichen zwischen Tabs im Tabwidget

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy