2014-07-24 11 views
7

Ich habe ein Fragment (Fragment 1), das durch ein anderes Fragment (Fragment 2) ersetzt wird. Fragment 1 wird auf den Stapel gelegt. Ich verwende den Kompatibilitätsmodus (nicht ActionBarSherlock).Ändern Sie Actionbar zu Overlay aus Fragment

Hier ist mein Problem. Ich möchte, dass die Aktionsleiste in einigen Fragmenten als Überlagerung angezeigt wird, in anderen nicht. Insbesondere wenn Fragment 2 angezeigt wird, möchte ich, dass es in Überlagerung erscheint und dann zur normalen Aktionsleiste zurückkehrt, sobald Fragment 2 beendet ist.

Fragment 1 hat eine regelmäßige ActionBar, die immer sichtbar ist. Aber wenn ich Fragment 1 durch Fragment 2 ersetze, muss ich die Aktionsleiste nach 5 Sekunden ausblenden. Wenn ein Berührungsereignis vorliegt, wird die Aktionsleiste erneut angezeigt. Das alles funktioniert gut, aber Fragment 2 wird jedes Mal neu gezeichnet, wenn die Aktionsleiste ausgeblendet oder aufgedeckt wird. Aus diesem Grund möchte ich die Actionbar in Fragment 2 als Overlay darstellen.

Ich weiß, ich kann die Actionbar-Overlay ändern, aber ich weiß nicht, wie das programmatisch aus dem Fragment zu tun. Ich will es nicht für jedes Fragment ändern, Fragment nur 2.

Idee ?????

+0

Actionbars sind aktivitätsabhängig, nicht die Lösung dafür ist möglicherweise nicht möglich mit der Standardaktionsleiste Sie möchten vielleicht nur Ihr eigenes actionbarähnliches Layout erstellen und dann haben Sie mehr Kontrolle darüber. Ich würde dies empfehlen, wenn Sie nur die Aktionsleiste wie für eine Titelleiste verwenden –

+0

Ich verstehe, dass Aktionsleisten aktivitätsabhängig sind. Und ich benutze die Actionbar für viel mehr als eine Titelleiste. Was ich denke, ist, wenn es eine Möglichkeit gibt, die Acionbar innerhalb des Fragments zu verändern, indem man zurück in die Hauptaktivität ruft. Das Problem ist, dass ich das programmatisch machen müsste, weil es zu spät ist, um eine Änderung über Themen vorzunehmen (denke ich). ????? – JustLearningAgain

+0

Wenn ich verstehe alles, was Sie wollen, ist in der Lage, die Aktionsleiste von Ihrem Fragment zu ändern, richtig? –

Antwort

10

Dies ist möglicherweise nicht die Antwort, auf die Sie gehofft hatten.

Betrachten Sie eine andere Frage: Können wir Aktivitätsthema ändern, nachdem setContentView(...) aufgerufen wurde? Die Frage wurde oft gefragt, und eine gemeinsame Lösung ist, die Aktivität zu erstellen (finish() und startActivity(getIntent()) Aufruf) und stellen Sie das neue Thema vor setContentView(...).

Ihre Frage ist eine Erweiterung dazu - mit zusätzlicher Komplexität der Änderung des Themas von einem Fragment. In jedem Fall halte ich die oben erwähnte Lösung für nicht gut.

ActionBar ist eine der ersten Komponenten, die initialisiert werden, wenn eine Aktivität erstellt wird. Ich glaube nicht, dass Sie einen Weg finden werden, ihn irgendwie mit neuen Attributen zu "erneuern". Im folgenden sehen Sie, wie sich die requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY) Methode befasst sich mit Post-setContentView (...) ruft:

@Override 
public boolean requestFeature(int featureId) { 
    if (mContentParent != null) { 
     throw new AndroidRuntimeException("requestFeature() must be 
                 called before adding content"); 
    } 
    .... 
    .... 
} 

Also, wenn setContentView(...) bereits für die Aktivität aufgerufen wurde (was es ist, in diesem Fall), eine Runtime-Ausnahme wird geworfen werden.

Ist es möglich, dass Sie diese Funktionalität nicht einmal benötigen?

zunächst die ActionBar Einstellung ein Overlay in Ihrem Thema zu sein:

<item name="android:windowActionBarOverlay">true</item> 
<!-- Support library attribute for compatibility --> 
<item name="windowActionBarOverlay">true</item> 

Hier ist mein Problem. Ich möchte, dass die Aktionsleiste in einigen Fragmenten als Überlagerung angezeigt wird.

Okay. Das haben wir bereits oben vorgesehen.

... aber nicht in anderen.

Angenommen, Sie möchten die ActionBar nicht als Überlagerung in Fragment B haben.Dann in Fragment B das Layout, die wie folgt vor:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="?android:attr/actionBarSize" > <<<-- ?attr/actionBarSize 
                    for compatibility 

    .... 
    .... 
</LinearLayout> 

Mit dem Top-Marge auf ActionBar Größe, sieht Fragment B, als ob es eine regelmäßige ActionBar hat - nicht eine überlagerte ein. Eine andere Möglichkeit, dies zu erreichen, wäre ein View mit android:layout_height="?android:attr/actionBarSize" als erstes Kind im obigen Layout zu platzieren.

Im Wesentlichen:

  • Ihre ActionBar wird ein Overlay sein.
  • In den Fragmenten, in denen die ActionBar automatisch ausgeblendet wird, hat das Fragmentlayout keinen, der einen oberen Randbereich aufweist.
  • In den Fragmenten, in denen die ActionBar nicht überlagert werden soll, wird das Fragmentlayout haben oberen Rand auf actionBarSize festgelegt.

Ein Punkt beachten (dank Jelle):

Wenn Ihr ActionBar halbtransparent ist, wäre es am besten Polsterung zu verwenden, anstatt Marge für einen einheitlichen Look.

+1

Ich benutze diese Methode auch. Wenn Ihr 'LinearLayout' einen benutzerdefinierten Hintergrund hat, ist es besser,' paddingTop' anstelle von 'marginTop' zu verwenden. – Jelle

+1

@Jelle Ah ja. Du hast recht. Wenn die Aktionsleiste (halb) transparent ist, würde Ihre Idee, Padding zu verwenden, am besten funktionieren. Aber wenn die Aktionsleiste einen undurchsichtigen Hintergrund/Farbe hat, wäre der Rand besser - keine Überziehung. Ich werde meine Antwort bearbeiten, um dies zu berücksichtigen. Vielen Dank. – Vikram

+0

Schöne Gedanken über die Überziehung! – Jelle

Verwandte Themen