Intereting Posts
Обработка динамической текстовой строки Android в res / values Как открыть новое действие, щелкнув элемент в списке? Android: ListView с кнопками -> OnItemClick ничего не делать Исключение нулевого указателя при вызове меры на раздутом макете Spannable RecyclerView, например Snapchat-Discover Активность Android возвращается к активности, которая запускала его вместо родительской активности при нажатии кнопки панели навигации Как поместить две кнопки на одной строке в Android Включить / отключить подключение к данным в программном обеспечении Android EditTextPreference вызывает исключение Inflate Android 4.4 дает ошибку ERR_CACHE_MISS в onReceivedError для WebView назад Ионная ошибка сборки: вы не приняли лицензионные соглашения следующих компонентов SDK: Где указывает LocalFileSystem.PERSISTENT? Должен ли я использовать JavaCV или Java-библиотеку OpenCV на Android? Google Play Store: приложения не требуют дополнительных специальных разрешений Как сделать кнопку, чтобы заполнить 50% от ширины экрана в android?

Попытайтесь понять поведение BottomSheet в библиотеке поддержки Android 23.2.1

Я пытаюсь реализовать нижний лист в одном из моих действий, и я немного смущен тем, как он себя ведет!

Итак, вот проблема, у меня есть активность, в которой я пытаюсь показать нижний лист, и я вижу, что:

  1. Если мы не установили свойство app:behavior_peekHeight то нижний лист никогда не работает

  2. Если вы установите PeekHeight на что-то меньшее, чем 30dp (в основном, чтобы скрыть его от экрана)

  3. Если вы установите app:behavior_peekHeight более чем на 30dp в файле макета и попробуйте установить состояние bottomSheetBehavior на STATE_HIDDEN в вашем методе WithCreate, приложение вылетает с этой ошибкой

вызванный:

 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.WeakReference.get()' on a null object reference at android.support.design.widget.BottomSheetBehavior.setState(BottomSheetBehavior.jav a:440) at myapp.activity.SomeActivity.onCreate(SomeActivity.java:75) 

Я действительно смущен тем, почему это не позволяет мне скрывать его в onCreate? Или почему мы не можем установить peekHeight в 0, чтобы он не отображался на экране, если мы не вызываем STATE_EXPANDED или даже не устанавливаем, что это свойство должно по умолчанию его скрывать! Или, по крайней мере, я должен уметь устанавливать его как скрытый в моем onCreate!

я что-то упускаю? Или поведение жесткого диска BottomSheet?

Мой файл макета для BottomSheet выглядит примерно так:

 <LinearLayout 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:background="@android:color/white" android:layout_height="100dp" android:orientation="vertical" app:behavior_hideable="true" app:behavior_peekHeight="40dp" <!-- I cant set this less than 30dp just to hide--> app:layout_behavior="@string/bottom_sheet_behavior" tools:context="someActivity" android:id="@+id/addressbottomSheet" tools:showIn="@layout/some_activity"> 

В моей деятельности я делаю что-то вроде этого:

 @InjectView(R.id.addressbottomSheet) View bottomSheetView; @Override protected void onCreate(Bundle savedInstanceState) { .... bottomSheetBehavior = BottomSheetBehavior.from(bottomSheetView); // only if I have set peek_height to more than 30dp bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); } 

В моем onclick я делаю это:

 @Override public void onItemClick(View view, int position) { bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); } 

Solutions Collecting From Web of "Попытайтесь понять поведение BottomSheet в библиотеке поддержки Android 23.2.1"

Поработав над этим вопросом еще несколько дней, я нашел одно альтернативное решение для этого:

Вместо того, чтобы использовать Bottom_sheet непосредственно внутри вашего макета, если мы создадим фрагмент Bottom_Sheet, а затем создаем его в действии, эта проблема не будет возникать, а нижний лист будет скрыт, и нам не нужно указывать peek_height

Вот что я сделал

 public class BottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_bottom_sheet, container, false); } 

Тогда в моей деятельности

 bottomSheetDialog = BottomSheetDialog.newInstance(addressList.get(position), position); bottomSheetDialog.show(getSupportFragmentManager(), AddressActivity.class.getSimpleName()); 

Это фактически решило мою проблему, когда нижний лист не был скрыт, когда начинается действие, но я все еще не могу понять, почему, если bottom_sheet включен непосредственно, мы сталкиваемся с этой проблемой!

Причина его срыва связана с тем, что слабая ссылка не устанавливается до одной из последних строк в onLayoutChild, что дает вам исключение из null ptr.

Что вы можете сделать, так это создать пользовательское поведение BottomSheet и переопределить onLayoutChild, установив там расширенное состояние.

Пример можно найти здесь: NullPointerExeption с AppCompat BottomSheets

(Ссылаясь на вопрос) Suzzi bro проблема с вашим кодом заключается в том, что вы пытаетесь вызвать метод setState непосредственно внутри onCreate. Это будет вызывать nullPointer, потому что WeakReference еще не инициализирован. Он будет инициализирован, когда планировщик Координатора собирается заложить свое детское представление.

OnLayoutChild (координаторLayout parent, V child, int layoutDirection)

Вызывается, когда родительский координаторLayout – это выкладка данного дочернего представления.

Поэтому лучший подход – установить высоту заглядания в 0 и показать / скрыть внутри слушателя onItemClick. Вот мой код:

bottom_sheet.xml

 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" android:gravity="center" android:orientation="vertical"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/ic_launcher" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Bottom sheet" android:textColor="@android:color/black" /> </LinearLayout> 

activity_main.xml

 <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show hide bottom sheet" /> <include android:id="@+id/gmail_bottom_sheet" layout="@layout/bottom_sheet" /> 

MainActivity.java

  public class MainActivity extends AppCompatActivity { boolean isExpanded; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CoordinatorLayout coordinatorLayout = (CoordinatorLayout) findViewById(R.id.gmail_coordinator); final View bottomSheet = coordinatorLayout.findViewById(R.id.gmail_bottom_sheet); final BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet); button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (isExpanded) { behavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } else { behavior.setState(BottomSheetBehavior.STATE_EXPANDED); } isExpanded = !isExpanded; } }); } } 

Здесь изначально нижний лист не виден. При нажатии кнопки мы будем устанавливать состояние STATE_COLLAPSED / STATE_EXPANDED.

Учебник, который я сделал, чтобы сделать это демонстрационное приложение, приведен ниже: Нижний лист с поддержкой Android Design Library

Чтобы избежать исключения указателя Null, установите состояние HIDDEN как это в onCreate ()

 View bottomSheetView = findViewById(R.id.bottomsheet_review_detail_id); mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheetView); bottomSheetView.post(new Runnable() { @Override public void run() { mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); } });