I created a full screen dialog with the official Guide
The problem is, that my Toolbar overlaps with the status bar and I cannot figure out how to solve this.
DialogFragment
JavaScript
x
public class CreateAccountDialogFragment extends BaseDialogFragment {
@Inject
CreateAccountViewModel viewModel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//InjectDependencies....
View rootView = createDataBinding(inflater, container);
createToolbar(rootView);
return rootView;
}
private View createDataBinding(LayoutInflater inflater, ViewGroup container) {
CreateAccountDialogFragmentBinding binding =
DataBindingUtil.inflate(inflater, R.layout.create_account_dialog_fragment, container, false);
binding.setViewModel(viewModel);
return binding.getRoot();
}
private void createToolbar(View rootView) {
Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
// Set an OnMenuItemClickListener to handle menu item clicks
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.action_save) {
viewModel.createAccount();
}
return true;
}
});
// Inflate a menu to be displayed in the toolbar
toolbar.inflateMenu(R.menu.create_account_menu);
toolbar.setTitle(R.string.create_account);
toolbar.setNavigationIcon(R.drawable.ic_cancel);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialogFragment.dismiss();
}
});
}
}
Layout
JavaScript
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="org.altoware.weity.viewmodels.CreateAccountViewModel"/>
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_light">
<include layout="@layout/toolbar"/>
<LinearLayout
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical">
<org.altoware.weity.views.BindableEditText
android:id="@+id/editTextUsername"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:addTextChangedListener="@{viewModel.onUsernameChanged}"
android:hint="Username"
android:singleLine="true"/>
<org.altoware.weity.views.BindableEditText
android:id="@+id/editTextPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:addTextChangedListener="@{viewModel.onPasswordChanged}"
android:hint="Password"
android:inputType="textPassword"
android:singleLine="true"/>
</LinearLayout>
</RelativeLayout>
Toolbar
JavaScript
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"
tools:showIn="@layout/activity_login">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"/>
</android.support.design.widget.AppBarLayout>
Activity creating Dialog
JavaScript
@Subscribe
public void showNewAccountDialog(OttoMessages.Login.ShowNewAccountDialog evt) {
FragmentManager fragmentManager = getSupportFragmentManager();
CreateAccountDialogFragment newFragment =
new CreateAccountDialogFragment();
boolean isLargeLayout = false;
if (isLargeLayout) {
newFragment.show(fragmentManager, "dialog");
} else {
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.add(android.R.id.content, newFragment)
.addToBackStack(null).commit();
}
}
EDIT
After removing StatusBarTransparency from v21-styles it looks like this
Advertisement
Answer
The problem is in the transaction.add(containerId, fragment) part.
You have it set to:
transaction.add(android.R.id.content, fragment)
, and it is the setting of it to android.R.id.content that is causing the overlap.
Instead, set it to the id of the parent’s content frame in the calling activity.
For example, in my code the main activity parent layout was a DrawerLayout, with id of drawer_layout, so my fix was
JavaScript
MyDialogFragment fragment = new MyDialogFragment ();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.add(R.id.drawer_layout, frag)
.addToBackStack(null).commit();