2016-07-05 37 views
1

Nach dem Drücken von FAB BottomSheet erscheint auf dem Bildschirm, aber die Position ist falsch (siehe Bild 1), ich möchte es wie auf dem Bild machen 2. Wie es zu beheben ?Falsche Position der BottomSheet im Bildschirm

Meine Aktivität:

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 des Adapters des RecyclerView, die in der BottomSheet ist:

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 des Bildschirms:

<?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> 

Artikel in der 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 von 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> 

Bild 1:

enter image description here

Bild 2:

enter image description here

Antwort

0

ich das Problem behoben, indem die fix Höhe der Einstellung BottomSheet, habe ich diese Codezeile geändert:

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

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