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.
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 –
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
Wenn ich verstehe alles, was Sie wollen, ist in der Lage, die Aktionsleiste von Ihrem Fragment zu ändern, richtig? –