2010-08-16 2 views
5

Mein Arbeitgeber lässt mich an einer Android-Anwendung mit sehr spezifischen UI-Anforderungen arbeiten. Insbesondere benötigen wir eine Schnittstelle, die genau wie eine TabWidget-Schnittstelle aussieht. Die Tabs auf der linken Seite sind jedoch ein absolutes Muss. Wir werden diese Anwendung nicht für Android-Telefone bereitstellen, sondern für ein In-House-Gerät, und als solches haben wir keine Probleme, irgendwelche Design-Überlegungen zu verletzen, die die Android-Plattform haben könnte.Vorhandene Patches für Android Tabwidget, um Tabs auf der linken Seite zu ermöglichen?

Wir haben bereits einen funktionierenden Prototyp, der die benötigten Funktionen mit einer Kombination aus Fokus-Listenern und Listenansichten zusammenfasst. Es ist nicht schön, und wir sind noch nicht sehr zuversichtlich, aber es funktioniert vorerst.

Wir würden wirklich gerne unseren gesamten UI-Code für den Prototypen wegwerfen, um das eingebaute TabWidget zu verwenden. Da TabWidget jedoch so programmiert ist, dass nur mit den Tabs oben gearbeitet wird, ist dies keine Option.

Also, wir hoffen, dass jemand da draußen einen Patch oder eine Reihe von Patches oder vielleicht eine benutzerdefinierte Klasse hat, die die TabWidget-Funktionalität mit den Tabs auf der Seite behandelt?

Der entsprechende Code für die TabWidget ist hier: 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

und die spezifische Funktion, die für seine Tabs oben fest einprogrammiert ist

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); 
} 

Wenn jemand irgendwelche Informationen hat, würde ich sehr dankbar .

Antwort

1

Ich hatte dieses Problem mit Tabs auf der Unterseite. Am Ende habe ich einfach alle Tab-Hintergrund-Zeichen kopiert und Schaltflächen mit statusbehafteten Zeichen- und Textfarben erstellt, die wie Tabs aussahen, die einen ViewFlipper im Hauptfenster der Benutzeroberfläche steuern, um zwischen den Ansichten zu wechseln.

+0

Es ist wirklich schade, dass TabActivty nicht mit Tabs auf der Unterseite oder auf der Seite umgehen kann. Ich sehe nicht, warum das nicht eingebaut ist. Ich habe einen Bug-Bericht auf dem Android-Bug-Tracker gefunden, aber es gibt wirklich keinen Hinweis, dass dies in absehbarer Zeit bearbeitet wird. http://code.google.com/p/android/issues/detail?id=3862&can=1&q=TabWidget&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars#makechanges –

1

(Beachten Sie, dass ich eine bessere Antwort weiter unten, vorbei an der Linie hinzugefügt. Ich bin falls es besser paßt jemand andere Bedürfnisse in diesem Top ein zu verlassen.)

Ja, ich habe mit dem beschäftigt gleicher Fehler. Ich habe eine etwas klobige Lösung. Ich habe festgestellt, dass Sie mit setRotate so ziemlich jede Ansicht drehen können. Leider rotiert dies nur sein Bild oder etwas und geht nicht vollständig auf Probleme oder Platzierung oder Größe oder Ausrichtung ein. Trotzdem habe ich es geschafft, etwas zusammenzubringen, das es irgendwie ausgleicht, obwohl es nur halb fertig ist (funktioniert nicht ganz richtig, wenn man in Hochformat dreht). Das Folgende wird aufgerufen, wenn das Tablet gedreht wird oder das Layout neu angeordnet wird oder was auch immer.

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 enthält mainView enthält myTabHost enthält ll1; Sie müssen sie im Initialisierungscode als solche zugewiesen haben. Die Idee ist, dass der TabHost im Uhrzeigersinn gedreht wird, und seine Abmessungen müssen manuell ausgetauscht werden, so dass seine Container wissen, dass es eine andere Größe/Form hat, jetzt, sonst werden die Kanten abgeschnitten. Außerdem werden einige Berechnungen durchgeführt, damit es um den richtigen Punkt rotiert wird oder zumindest an der richtigen Stelle endet. Die Ergebnisse haben nicht immer Sinn gemacht, also habe ich einfach das Zeug gewechselt, bis es funktionierte, zumindest im Querformat. Der Inhalt des TabHosts wird ebenfalls gedreht, also gibt es Code, der ihn zurückdreht, zumindest den ersten Tab, der 11 ist. Andere Registerkarten müssten ähnlich zurück gedreht werden. Ich habe eine Weile damit herumgespielt, und vielleicht gibt es einige Dinge, die unnötig sind. Zum Beispiel die Hauptansicht. Ich denke, das muss nicht da sein. Oh, und wenn der TabHost an einem anderen Ort ist, müssen die Zahlen irgendwie angepasst werden. Viel Glück damit. Jedenfalls hoffe ich, dass das jemandem hilft. Mann, Android GUI ist so ärgerlich ... Ich wünschte, sie würden es reparieren ....Ich gebe jedoch zu, dass trotz aller Hindernisse und Frustrationen, ist die Rotation aller Komponenten ziemlich cool. Ich wünschte nur, alles andere würde so funktionieren, wie du es erwartest.


Hey, ich habe gerade herausgefunden, wie man es richtig macht! Die Etiketten bleiben horizontal, so dass kann oder auch nicht eine gute Sache sein, je nachdem, was Sie wollen, aber trotzdem:

<?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> 

Diese XML-Datei definiert eine leere TabHost mit den Registerkarten auf der rechten Seite. Fügen Sie einfach die Tabs in Ihrem Code hinzu. Dafür gibt es Posts. Kopieren/ändern/tun, was immer Sie tun müssen, um es Ihren Bedürfnissen anzupassen. Außerdem, weil es cool ist, habe ich eine Scroll-Ansicht um das Tabwidget hinzugefügt, sodass es automatisch scrollen kann, wenn Sie zu viele Tabs haben. Werden Sie es los, wenn Sie es nicht wollen. Habe die Scroll-Sache meistens von http://java.dzone.com/articles/scrolling-tabs-android bekommen. Yay!

+0

das sieht aus wie es funktionieren sollte, aber Ich bekomme seltsame Ergebnisse. Ich habe dein XML kopiert und eingefügt. Bei mir werden die Registerkarten zwar nach rechts verschoben, aber die Registerkarten sind immer noch horizontal angeordnet, und unter ihnen befindet sich ein großer leerer Bereich mit dem Tabulatorinhalt links davon. es ist sehr hässlich, und ich kann mir nicht vorstellen, dass du das beabsichtigst? –

+0

Nun, ursprünglich nicht, aber es endete gut für meine Zwecke. Vielleicht liegt es daran, dass ich ein Tablet habe, also gibt es genug Platz für die horizontalen Registerkarten. Außerdem muss ich eine große Anzahl von Tabs in den Raum einfügen, so dass es für mich sowieso besser funktioniert. Entschuldigung, dass es nicht ganz das ist, wonach du gesucht hast. Du könntest immer noch versuchen, mit der Objektrotation herumzualbern, vielleicht in Verbindung damit, irgendwie. Viel Glück! – Erhannis

Verwandte Themen