fitsSystemWindows für Fragment-, Aktivitäts- und DrawerLayout-Kombination
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?
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>
BeispieDasLinearLayout
as 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.