Android NestedScrollView имеет неправильный размер после приложения: layout_behavior
Так как Google опубликовал библиотеку поддержки дизайна для Android, есть много приятных вещей, которые можно сделать без реализации настраиваемого кода. Пока я тестировал пользовательские представления в этой библиотеке, я нашел худшую вещь, и я не знал, является ли это ошибкой или нет.
Я нашел проект cheesesquare на github. В файле activity_detail.xml(файл макета) есть 3 CardViews внутри NestedScrollView. Если вы удалите 2 из них, вы увидите, что NestedScrollView не имеет полного размера родителя (match_parent). NestedScrollView привязан к нижней части родительского представления. http://i.stack.imgur.com/BXl7w.png
NestedScrollView получает свой полный размер, когда я удаляю app:layout_behavior="@string/appbar_scrolling_view_behavior"
.
Но когда я удаляю поведение макета, панель инструментов не рушится.
Есть ли какое-либо исправление для этого? Пример файла макета можно найти здесь: https://github.com/Smove/cheesesquare/blob/stackoverflow/app/src/main/res/layout/activity_detail.xml
Вы можете построить aps cheesesquare из моей ветки github stackoverflow
Ответы
Ответ 1
У меня была эта проблема и исправлено добавление:
android:layout_gravity="fill_vertical"
в NestedScrollView. Затем он начинает вести себя правильно, как я объяснил здесь. Конечно, NestedScrollView нуждается в каком-то дочернем элементе (т.е. Он не должен быть пустым), иначе панель инструментов не рухнет.
Update
Хотя это хорошо работает с небольшим контентом, я заметил, что у него есть некоторые проблемы, показывающие более длительное содержимое, например. как полный activity_detail.xml
выше. Проблема в том, что вы не можете прокручивать до самой нижней части содержимого - она недоступна внизу.
Из моих тестов я мог обнаружить, что недостающая часть , как большая, как свернутая панель инструментов (или, по крайней мере, то, что мне кажется). Чтобы исправить это, проблема и наличие решения, надежного как для малого, так и для большого содержимого, вы должны добавить layout_marginBottom
в ScrollView, чтобы он измерился и выпустил недостающую нижнюю часть. Таким образом:
android:layout_gravity="fill_vertical"
android:layout_marginBottom="?attr/actionBarSize"
или любой размер, который вы указали для Toolbar
.
Но все же
Прокрутка с небольшим содержимым с помощью этого решения, даже если содержимое выравнивается по вертикали вверху, на самом деле не так гладко, как прокрутка с большим содержимым. Я буду использовать до тех пор, пока не появится исправление библиотеки.
Update2
Похоже, это было исправлено в v22.2.1.
Ответ 2
использовать RecyclerView заменить NestedScrollView исправить эту ошибку
установить количество элементов 1, чтобы ViewHolder возвращал ваш реальный контентView;
мой код:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
// 添加分割线
recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext()));
recyclerView.setAdapter(new Adapter<ViewHolder>() {
@Override
public int getItemCount() {
return 1;
}
@Override
public void onBindViewHolder(ViewHolder holder, int arg1) {
WebView view = (WebView) holder.itemView;
view.getSettings().setJavaScriptEnabled(true);
view.loadUrl("http://www.baidu.com");
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
return new ViewHolder(inflater.inflate(R.layout.webview, arg0, false)) {
};
}
});
Ответ 3
Обход
Прежде чем показывать свой NestedScrollView и после привязки данных к содержимому NestedScrollView, я вызываю метод fullScroll (int direction) моего экземпляра NestedScrollView с направлением View.FOCUS_UP в качестве аргумента.
Пример кода для фрагмента:
NestedScrollView scrollView = (NestedScrollView) getActivity(). findViewById (R.id.scroll_view);
scrollView.fullScroll(View.FOCUS_UP);