fitsSystemWindows für Fragment-, Aktivitäts- und DrawerLayout-Kombination

Proble

Das Aktivitätslayout hat einDrawerLayout mit einerFrameLayout als Inhalt zuFragment und einLinearLayout mit der Schublade zu öffnen und zu schließen. Das für den Inhalt verwendete Fragment hat einFrameLayout mitfitsSystemWindows flag und einToolbar.

Wenn ich das Fragment bei @ einfügonCreate() all tritt wie erwartet auf, dasFrameLayout startet auf Position 0 und dasToolbar beginnt unterhalb der Statusleiste. Aber außerhalb desonCreate() derselbe Code schlägt fehl, dasfitsSystemWindows funktioniert nicht mitFrameLayout.

Ein wichtiger Punkt, ich brauche dasToolbar undfitsSystemWindows flag onFragment und nicht amActivity.

Wie bekomme ich das gleiche Verhalten wie beionCreate() moment?

Cod

Hauptaktivitä

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            window.setStatusBarColor(Color.TRANSPARENT);
        }

        setContentView(R.layout.activity);

        findViewById(R.id.item).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Out of onCreate fails
                replaceFragment();
            }
        });

        // With onCreate all OK
        replaceFragment();
    }

    private void replaceFragment() {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.content, new MainFragment())
                .commit();
    }

}

Hauptlayout

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <LinearLayout
        android:layout_width="256dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#ff0000"
        android:orientation="vertical"
        tools:layout_gravity="">

        <View
            android:layout_width="match_parent"
            android:layout_height="168dp"
            android:layout_marginBottom="16dp"
            android:background="#00ffff"/>

        <TextView
            android:id="@+id/item"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:background="#ff00ff"
            android:gravity="center"
            android:text="Click me"/>

    </LinearLayout>

</android.support.v4.widget.DrawerLayout>

Fragmen

public class MainFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
                                                @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment, container, false);
    }

}

Fragmentierungslayout:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#00ff00"
        android:fitsSystemWindows="true">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:background="#0000ff"/>

    </FrameLayout>

</RelativeLayout>
Beispie

DasLinearLayoutas zu öffnende @ ist rot. DasFrameLayout mit demfitsSystemWindows flag ist in grün und die Symbolleiste ist in blau, die Cyan-Ansicht funktioniert die ganze Zeit, sie muss an y-Position 0 beginnen. Der erwartete Wert ist Grün und Blau wie beim ersten Mal, aber beim zweiten Mal ist das Blau das Einzigartige angesehen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage