2010-08-16 8 views
5

Il mio datore di lavoro mi sta facendo lavorare su un'applicazione Android con requisiti dell'interfaccia utente molto specifici. In particolare, abbiamo bisogno di un'interfaccia che assomigli esattamente a un'interfaccia di TabWidget. Tuttavia, avere le schede sul lato sinistro è assolutamente necessario. Non implementeremo questa applicazione su nessun telefono Android, è per un dispositivo interno e, come tale, non ha alcun problema a violare le considerazioni progettuali che potrebbero avere la piattaforma Android.Patch esistenti per Android Tabwidget per consentire le schede sul lato sinistro?

Abbiamo già un prototipo funzionante che integra le funzionalità di cui abbiamo bisogno utilizzando una combinazione di ascoltatori di messa a fuoco e visualizzazioni elenco. Non è bello, e non ne siamo ancora molto fiduciosi, ma funziona per il momento.

Quello che ci piacerebbe davvero è buttare via tutto il nostro codice UI prototipo in cambio dell'utilizzo del TabWidget integrato. Tuttavia, poiché TabWidget è hardcoded per funzionare solo con le schede in alto, questa non è davvero un'opzione.

Quindi, speriamo che qualcuno là fuori abbia una patch, o un set di patch, o forse una classe personalizzata, che gestisca invece la funzionalità TabWidget con le schede sul lato?

Il codice rilevante per la TabWidget è qui: http://www.google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/widget/TabWidget.java&q=android%20package:git://android.git.kernel.org%20lang:java%20tabwidget&sa=N&cd=1&ct=rc

e la funzione specifica che è codificato per essere le schede sulla parte superiore è

private void initTabWidget() { 
    setOrientation(LinearLayout.HORIZONTAL); 
    mGroupFlags |= FLAG_USE_CHILD_DRAWING_ORDER; 

    final Context context = mContext; 
    final Resources resources = context.getResources(); 

    if (context.getApplicationInfo().targetSdkVersion <= Build.VERSION_CODES.DONUT) { 
     // Donut apps get old color scheme 
     if (mLeftStrip == null) { 
      mLeftStrip = resources.getDrawable(
        com.android.internal.R.drawable.tab_bottom_left_v4); 
     } 
     if (mRightStrip == null) { 
      mRightStrip = resources.getDrawable(
        com.android.internal.R.drawable.tab_bottom_right_v4); 
     } 
    } else { 
     // Use modern color scheme for Eclair and beyond 
     if (mLeftStrip == null) { 
      mLeftStrip = resources.getDrawable(
        com.android.internal.R.drawable.tab_bottom_left); 
     } 
     if (mRightStrip == null) { 
      mRightStrip = resources.getDrawable(
        com.android.internal.R.drawable.tab_bottom_right); 
     } 
    } 

    // Deal with focus, as we don't want the focus to go by default 
    // to a tab other than the current tab 
    setFocusable(true); 
    setOnFocusChangeListener(this); 
} 

Se qualcuno ha qualche informazione, sarei molto grata .

risposta

1

Ho riscontrato questo problema con le schede in basso. Ho finito per copiare tutti i drawable di sfondo della scheda e creare pulsanti con drawable stateful e textcolor che sembravano schede che controllavano un ViewFlipper nel riquadro dell'interfaccia utente principale per passare da una vista all'altra.

+0

È un vero peccato che TabActivty non possa gestire da solo le schede in basso o di lato. Non vedo perché questo non è integrato. Ho individuato un bug report sul bug tracker di Android, ma non c'è davvero alcuna indicazione che ciò possa essere risolto in qualsiasi momento a breve. http://code.google.com/p/android/issues/detail?id=3862&can=1&q=TabWidget&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars#makechanges –

1

(Si noti che ho aggiunto una risposta migliore, più in basso, oltre la linea. Sto lasciando questo top nel caso in cui meglio si adatta qualcun altro ha bisogno.)

Sì, ho avuto a che fare con la stesso problema. Ho una soluzione piuttosto goffo. Ho notato che puoi ruotare praticamente qualsiasi vista con setRotate. Sfortunatamente, questo ruota solo la sua immagine, o qualcosa del genere, e non si occupa completamente di problemi o collocazione o dimensione o allineamento. Anche così, sono riuscito a mettere insieme qualcosa che lo compensa, anche se è solo a metà (non funziona bene se si ruota in verticale). Il seguente viene chiamato ogni volta che il tablet viene ruotato o il layout viene riorganizzato o altro.

private LinearLayout llMain; 
private LinearLayout ll1; 
private LinearLayout mainView; 
private TabHost myTabHost; 

public void setStuff() { 
    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
    if (display.getOrientation() == 0 || display.getOrientation() == 2) { 
     ViewGroup.LayoutParams lp = myTabHost.getLayoutParams(); 
     int top = 0; 
     int left = 0; 
     int height = 696; 
     int width = 1280; 
     int centerx = (width/2) + left; 
     int centery = (height/2) + top; 
     lp.height = width; 
     lp.width = height; 
     myTabHost.setLayoutParams(lp); 
     myTabHost.setTranslationX(centerx - (height/2)); 
     myTabHost.setTranslationY(centery - (width/2)); 
     lp = mainView.getLayoutParams(); 
     lp.width = 1280; 
     lp.height = 696; 
     mainView.setLayoutParams(lp); 
     lp = llMain.getLayoutParams(); 
     lp.width = 1280; 
     lp.height = 696; 
     llMain.setLayoutParams(lp); 

     ll1.setRotation(-90); 
     lp = ll1.getLayoutParams(); 
     lp.height = 696; 
     lp.width = 1141; 
     ll1.setLayoutParams(lp); 
     left = 0; 
     top = 0; 
     height = 696; 
     width = 1141; 
     centerx = (width/2) + left; 
     centery = (height/2) + top; 
     ll1.setTranslationX(centery - (width/2)); 
     ll1.setTranslationY(centerx - (height/2)); 
     //ll1.setTranslationX(tx); 
     //ll1.setTranslationY(ty); 
    } else { 
     ViewGroup.LayoutParams lp = myTabHost.getLayoutParams(); 
     int top = 0; 
     int left = 0; 
     int height = 1280; 
     int width = 696; 
     int centerx = (width/2) + left; 
     int centery = (height/2) + top; 
     lp.height = width; 
     lp.width = height; 
     myTabHost.setLayoutParams(lp); 
     myTabHost.setTranslationX(centerx - (height/2)); 
     myTabHost.setTranslationY(centery - (width/2)); 
     lp = mainView.getLayoutParams(); 
     lp.width = 696; 
     lp.height = 1280; 
     mainView.setLayoutParams(lp); 
     lp = llMain.getLayoutParams(); 
     lp.width = 696; 
     lp.height = 1280; 
     llMain.setLayoutParams(lp); 

     ll1.setRotation(-90); 
     lp = ll1.getLayoutParams(); 
     lp.height = 1141; 
     lp.width = 696; 
     ll1.setLayoutParams(lp); 
     left = 0; 
     top = 0; 
     height = 1141; 
     width = 696; 
     centerx = (width/2) + left; 
     centery = (height/2) + top; 
     ll1.setTranslationX(centery - (width/1)); 
     ll1.setTranslationY(centerx - (height/1)); 
     //ll1.setTranslationX(tx); 
     //ll1.setTranslationY(ty); 
    } 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setStuff(); 
    //setContentView(R.layout.main); 
} 

llMain contiene mainView contiene myTabHost contiene ll1; è necessario averli assegnati come tali nel codice di inizializzazione. L'idea è che il TabHost venga ruotato in senso orario, e le sue dimensioni devono essere scambiate manualmente in modo che i contenitori sappiano che è di una dimensione/forma diversa, ora, altrimenti i bordi vengono tagliati. Inoltre, alcuni calcoli vengono eseguiti in modo che vengano ruotati attorno al punto giusto, o almeno finiscano nel posto giusto. I risultati non hanno sempre avuto senso, quindi ho solo cambiato le cose fino a quando non ha funzionato, almeno in modalità orizzontale. Anche il contenuto del TabHost viene ruotato, quindi c'è del codice lì dentro che lo ruota indietro, almeno la prima scheda, che è ll1. Altre schede dovrebbero essere ruotate allo stesso modo. Ho fatto un po 'di casino con questo, e potrebbero esserci alcune cose che non sono necessarie. Ad esempio, il mainView. Penso che non sia necessario essere lì. Oh, e se il TabHost è in un posto diverso, i numeri dovranno essere regolati in qualche modo. Buona fortuna. Ad ogni modo, spero che questo aiuti qualcuno. Uomo, la GUI di Android è così aggravante ... vorrei che lo aggiustassero ...Devo ammettere, tuttavia, che nonostante tutti gli ostacoli e le frustrazioni, la rotazione di qualsiasi componente è piuttosto interessante. Spero solo che tutto il resto funzioni come ti aspetteresti.


Ehi, ho appena capito come ottenerlo per farlo correttamente! Le etichette rimangono orizzontale, in modo che possono o non possono essere una buona cosa, a seconda di ciò che si vuole, ma in ogni caso:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <TabHost android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent"> 
     <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> 
      <FrameLayout android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_weight="1" android:id="@android:id/tabcontent"></FrameLayout> 
      <ScrollView android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:fillViewport="true" 
       android:scrollbars="none">   
       <TabWidget android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:id="@android:id/tabs"></TabWidget> 
      </ScrollView> 
     </LinearLayout> 
    </TabHost> 

</LinearLayout> 

Questo file XML definisce un tabhost vuota con le linguette a destra. Basta aggiungere le schede nel codice; ci sono post in giro per quello. Copia/modifica/fai tutto ciò che devi fare per adattarlo alle tue esigenze. Inoltre, perché è bello, ho aggiunto una vista a scorrimento attorno al tabwidget, quindi lo scrollò automaticamente se hai troppe tabulazioni. Sbarazzati se non lo vuoi. Ho la cosa di scorrimento principalmente da http://java.dzone.com/articles/scrolling-tabs-android. Sìì!

+0

sembra che dovrebbe funzionare, ma ottengo risultati strani Ho copiato e incollato il tuo xml. per me, mette le schede a destra, ma le schede sono ancora disposte orizzontalmente, e c'è un grande spazio vuoto sotto di loro, con il contenuto della scheda a sinistra di esso. è molto brutto, e non riesco a immaginare che è quello che intendevi? –

+0

Beh, non originariamente, ma ha funzionato bene per i miei scopi. Forse è perché ho un tablet, quindi c'è un sacco di spazio per le schede di essere orizzontale. Inoltre, ho bisogno di inserire un buon numero di schede nello spazio, quindi funziona meglio per me, comunque. Mi dispiace che non sia proprio quello che stavi cercando. Potresti ancora provare a fare scherzi con la rotazione dell'oggetto, magari in combinazione con questo, in qualche modo. In bocca al lupo! – Erhannis