Android: schede nella parte inferiore


148

Ho visto delle chiacchiere su questo, ma niente di definito. C'è un modo per mettere le schede in un TabWidget nella parte inferiore dello schermo? Se é cosi, come?

Ho provato quanto segue, ma non ha funzionato:

a) impostazione del tabwidget sotto il framelayout
b) impostazione della gravità del tabwidget su "bottom"

Grazie! llappall


10
Si prega di definire "non ha funzionato".
Commons War


3
Guarda qui se vuoi iPhone come host di schede.
Adil Soomro,

Risposte:


272

Ecco la soluzione più semplice, più robusta e scalabile per ottenere schede nella parte inferiore dello schermo.

  1. Nel tuo LinearLayout verticale, posiziona il FrameLayout sopra il TabWidget
  2. Situato layout_heighta wrap_contentsu entrambi FrameLayout e TabWidget
  3. Imposta FrameLayout's android:layout_weight="1"
  4. Imposta TabWidget android:layout_weight="0"(0 è l'impostazione predefinita, ma per enfasi, leggibilità, ecc.)
  5. Imposta TabWidget android:layout_marginBottom="-4dp"(per rimuovere il divisore inferiore)

Codice completo:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    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">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:layout_weight="1"/>

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:layout_marginBottom="-4dp"/>

    </LinearLayout>

</TabHost>

3
Il divisore è in realtà codificato. Stavo cercando di cambiare i drawable utilizzati per le schede e l'ho trovato. Peccato totale.
Jeremy Logan,

6
Dovresti selezionare questo (o qualcosa) come risposta accettata.
JediPotPie,

4
L'unica deviazione richiesta qui dall'esempio TabWidget standard di Google è l'impostazione layout_weight=1su FrameLayout. Ciò consente al controllo di tabulazione di "rivendicare" prima la sua altezza dal LinearLayout.
Nick Farina,

19
Per eliminare il divisore nella parte inferiore del TabWidget, è sufficiente aggiungere android:layout_marginBottom="-5px"al TabWidget. Questo sposterà TabWidget dalla parte inferiore dello schermo di 5 pixel, quel tanto che basta per non vedere il divisore. FrameLayout compenserà le dimensioni in modo che funzioni perfettamente. Non sono sicuro che la dimensione del divisore cambi su dispositivi più grandi o meno. Potrebbe essere necessario utilizzare dpinvece di px.
Jake Wilson,

1
Ho incorporato il commento di rimozione del divisore nella risposta.
Arne Evertsson,

38

Provalo;) Basta guardare il contenuto di FrameLayout (@ id / tabcontent), perché non so come gestirà in caso di scorrimento ... Nel mio caso funziona perché ho usato ListView come contenuto delle mie schede . :) Spero che sia d'aiuto.

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <RelativeLayout 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent">
        <FrameLayout android:id="@android:id/tabcontent"
             android:layout_width="fill_parent" 
             android:layout_height="fill_parent"
             android:layout_alignParentTop="true" 
             android:layout_above="@android:id/tabs" />
    <TabWidget android:id="@android:id/tabs"
             android:layout_width="fill_parent" 
             android:layout_height="wrap_content"
             android:layout_alignParentBottom="true" />
    </RelativeLayout>
</TabHost>

4
+1 Ma hai notato la barra nera / grigia nella parte superiore dello schermo? Come lo hai rimosso?
Ahmet Emrah,

Sto usando questo per pubblicare il widget della scheda sul lato sinistro del modulo.
mr.j05hua,

12

C'è un modo per rimuovere la linea.

1) Segui questo tutorial: android-tabs-with-fragments

2) Quindi applicare la modifica RelativeLayout suggerita da Leaudro in precedenza (applicare gli oggetti di layout a tutti i FrameLayout).

Puoi anche aggiungere un ImageView a tab.xml nell'elemento # 1 e ottenere un aspetto molto simile a iPhone nelle schede.

Ecco uno screenshot di ciò su cui sto lavorando in questo momento. Ho ancora del lavoro da fare, principalmente creare un selettore per le icone e garantire un'equa distribuzione orizzontale, ma hai capito. Nel mio caso, sto usando i frammenti, ma gli stessi principi dovrebbero applicarsi a una vista a schede standard.

inserisci qui la descrizione dell'immagine


È passato un po 'di tempo da quando lo hai pubblicato, ma il tuo link ora dice Benvenuto in nginx! e nient'altro c'è sulla pagina.
DroidDev,

1
Non era il mio sito, purtroppo non ho il controllo su di esso. Dopo questo lasso di tempo, tuttavia, i sistemi sono cambiati abbastanza che probabilmente non dovresti implementare questo tipo di interfaccia per i tuoi utenti Android, si aspetterebbero che le cose funzionino un po 'diversamente ora.
Brill Pappin,

3

Non sono sicuro che funzionerà per tutte le versioni di Android (in particolare quelle con elementi dell'interfaccia utente personalizzati), ma sono stato in grado di rimuovere la barra grigia in basso aggiungendo

 android:layout_marginBottom="-3dp"

all'XML TabWidget ...


3

Per tutti quelli che provano a rimuovere la linea di separazione del tabWidget, ecco un esempio di progetto (e il relativo tutorial), che funzionano alla grande per personalizzare le schede e rimuovere così i problemi quando le schede sono in fondo. Progetto Eclipse: android-custom-tabs ; Spiegazione originale: blog ; Spero che questo abbia aiutato.


3

Esistono due modi per visualizzare le schede nella parte inferiore di un'attività delle schede.

  1. Utilizzando il layout relativo
  2. Utilizzando l'attributo Layout_weight

Si prega di controllare il link per maggiori dettagli .


3
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1" />

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:background="#252a31"
            android:tabStripEnabled="false" >
        </TabWidget>
    </LinearLayout>

</TabHost>

1

Questo potrebbe non essere esattamente quello che stai cercando (non è una soluzione "facile" per inviare le tue schede nella parte inferiore dello schermo) ma è comunque un'interessante soluzione alternativa che vorrei segnalare a te:

ScrollableTabHost è progettato per comportarsi come TabHost, ma con una vista di scorrimento aggiuntiva per adattarsi a più elementi ...

forse scavando in questo progetto open source troverai una risposta alla tua domanda. Se vedo qualcosa di più semplice, tornerò da te.


1

Avevo lo stesso problema con le schede Android quando provavo a posizionarle nella parte inferiore dello schermo. Il mio scenario era di non usare un file di layout e creare le schede nel codice, ma stavo anche cercando di sparare attività da ciascuna scheda che sembrava un po 'troppo complessa usando altri approcci, quindi ecco il codice di esempio per superare il problema:

aggiungendo-schede-a-android-e-sistemazione-li


1

Sì, vedi: link , ma ha usato layout xml, non attività per creare una nuova scheda, quindi inserisci il suo codice xml (imposta paddingTop per FrameLayout - 0px) e quindi scrivi il codice:

public class SomeActivity extends ActivityGroup {

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

    TabHost tab_host = (TabHost) findViewById(R.id.edit_item_tab_host); 

    tab_host.setup(this.getLocalActivityManager());

    TabSpec ts1 = tab_host.newTabSpec("TAB_DATE"); 
    ts1.setIndicator("tab1"); 
    ts1.setContent(new Intent(this, Registration.class)); 
    tab_host.addTab(ts1); 

    TabSpec ts2 = tab_host.newTabSpec("TAB_GEO"); 
    ts2.setIndicator("tab2"); 
    ts2.setContent(new Intent(this, Login.class)); 
    tab_host.addTab(ts2); 

    TabSpec ts3 = tab_host.newTabSpec("TAB_TEXT"); 
    ts3.setIndicator("tab3"); 
    ts3.setContent(new Intent(this, Registration.class)); 
    tab_host.addTab(ts3); 

    tab_host.setCurrentTab(0);      


}

}


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.