Lucky_girl Lucky_girl - 5 months ago 17
Android Question

Wrong position of the BottomSheet in the screen

After the pressing of FAB BottomSheet appears in the screen, but the position of it is wrong (see picture 1), I want to make it as in the picture 2. How to fix it?

My Activity:

public class FirstscreenActivity extends AppCompatActivity implements RecyclerItemClickListener.OnItemClickListener,
ItemAdapter.ItemListener {

private BottomSheetDialog mBottomSheetDialog;
BottomSheetBehavior behavior;
private ItemAdapter mAdapterItem;
private FloatingActionButton floatButton;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.front);

floatButton = (FloatingActionButton) findViewById(R.id.float_button);
floatButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showBottomSheetDialog();
mBottomSheetDialog.getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
mBottomSheetDialog.getWindow().setGravity(Gravity.BOTTOM);

}
});


View bottomSheet = findViewById(R.id.bottom_sheet);
behavior = BottomSheetBehavior.from(bottomSheet);

behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
// React to state change

}

@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
// React to dragging events
}
});
mAdapterItem = new ItemAdapter(createItems(), this);
}

@Override
protected void onResume() {
super.onResume();
RecyclerViewAdapter adapter = (RecyclerViewAdapter) mList.getAdapter();
adapter.notifyDataSetChanged();
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.menu, menu);
return super.onPrepareOptionsMenu(menu);
}

private void showBottomSheetDialog() {

if (behavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
}

mBottomSheetDialog = new BottomSheetDialog(this);

View view = getLayoutInflater().inflate(R.layout.sheet, null);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new ItemAdapter(createItems(), new ItemAdapter.ItemListener() {
@Override
public void onItemClick(Item item) {
if (mBottomSheetDialog != null) {
mBottomSheetDialog.dismiss();
}
}
}));

mBottomSheetDialog.setContentView(view);
mBottomSheetDialog.show();
mBottomSheetDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
mBottomSheetDialog = null;
}
});
}


@Override
protected void onDestroy() {
super.onDestroy();
mAdapterItem.setListener(null);
}

public List<Item> createItems() {
ArrayList<Item> items = new ArrayList<>();
items.add(new Item("Add new record"));
items.add(new Item(R.drawable.camera, "from new shoots"));
items.add(new Item(R.drawable.folder_multiple_image, "from ready images"));
return items;
}


@Override
public void onItemClick(Item item) {
behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
}
}


Code of the adapter of the RecyclerView, which is in the BottomSheet:

public class ItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private List<Item> mItems;
private ItemListener mListener;

public ItemAdapter(List<Item> items, ItemListener listener) {
mItems = items;
mListener = listener;
}

public void setListener(ItemListener listener) {
mListener = listener;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

switch (viewType) {
case 0:
return new ViewHolderModified(LayoutInflater.from(parent.getContext())
.inflate(R.layout.bottom_title, parent, false));
default:
return new ViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.item, parent, false));
}

}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (position == 0){
ViewHolderModified holderModified = (ViewHolderModified)holder;
holderModified.setData(mItems.get(position));
}
else {
ViewHolder viewHolder = (ViewHolder)holder;
viewHolder.setData(mItems.get(position));
}
}

@Override
public int getItemCount() {
return mItems.size();
}

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

public ImageView imageView;
public TextView textView;
public Item item;

public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
imageView = (ImageView) itemView.findViewById(R.id.imageView);
textView = (TextView) itemView.findViewById(R.id.textView);
}

public void setData(Item item) {
this.item = item;
imageView.setImageResource(item.getDrawableResource());
textView.setText(item.getTitle());
}

@Override
public void onClick(View v) {
if (mListener != null) {
mListener.onItemClick(item);
}
}
}

public class ViewHolderModified extends RecyclerView.ViewHolder implements View.OnClickListener {

public TextView textView;
public Item item;

public ViewHolderModified(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
textView = (TextView) itemView.findViewById(R.id.titleView);
}

public void setData(Item item) {
this.item = item;
textView.setText(item.getTitle());
}

@Override
public void onClick(View v) {
if (mListener != null) {
mListener.onItemClick(item);
}
}
}


public interface ItemListener {
void onItemClick(Item item);
}

@Override
public int getItemViewType(int position) {
return position;
}
}


xml of the screen:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.v7.widget.Toolbar
android:id="@+id/my_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#118b0a"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/my_toolbar" />

<android.support.design.widget.FloatingActionButton
android:id="@+id/float_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_margin="16dp"
android:src="@drawable/add_white"
app:backgroundTint="@color/red"
/>


<android.support.design.widget.CoordinatorLayout
android:layout_width="0dp"
android:layout_height="0dp">

<LinearLayout
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#fff"
android:gravity="bottom"
android:orientation="vertical"
app:layout_behavior="@string/bottom_sheet_behavior">

</LinearLayout>

</android.support.design.widget.CoordinatorLayout>

</RelativeLayout>


Item in the RecyclerView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/imageView"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="16dp"
android:src="@mipmap/ic_launcher" />

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:textColor="@color/black"
android:gravity="center_vertical"
android:textSize="22sp" />

</LinearLayout>


Xml of BottomSheet:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:gravity="center_vertical"
android:orientation="horizontal">

<TextView
android:id="@+id/titleView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"
android:gravity="center_vertical"
android:textColor="#787878"
android:textSize="20sp" />
</LinearLayout>


Picture 1:

enter image description here

Picture 2:

enter image description here

Answer

I fixed the problem by setting the fix height of the BottomSheet, I changed this line of code:

mBottomSheetDialog.getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

to: mBottomSheetDialog.getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, 700);