Android NestedScrollView имеет неправильный размер после приложения: layout_behavior

17

Так как Google опубликовал библиотеку поддержки дизайна для Android, есть много приятных вещей, которые можно сделать без реализации настраиваемого кода. Пока я тестировал пользовательские представления в этой библиотеке, я нашел худшую вещь, и я не знал, является ли это ошибкой или нет.

Я нашел проект cheesesquare на github. В activity_detail.xml (файл макета) есть 3 CardViews внутри NestedScrollView. Если вы удалите 2 из них, вы увидите, что NestedScrollView не имеет полного размера родителя (match_parent). NestedScrollView привязан к нижней части родительского представления. Ссылка

NestedScrollView получает свой полный размер, когда я удаляю app:layout_behavior="@string/appbar_scrolling_view_behavior" .

Но когда я удаляю поведение макета, панель инструментов не рушится.

Есть ли какое-либо исправление для этого? Пример файла макета можно найти здесь: Ссылка

Вы можете построить cheesesquare apk из моей ветки github stackoverflow

    
задан Jan 03.06.2015 в 08:22
источник
  • У меня такая же проблема. Это выглядит особенно плохо, если вы используете тень в верхней части NestedScrollView. –  Jimeux 03.06.2015 в 12:55
  • Такая же проблема здесь! Если содержимое не больше, чем scrollview, оно выровнено внизу и ведет себя очень странно :( RecyclerView работает отлично (также если есть только один элемент). –  Philip Giuliani 04.06.2015 в 19:25
  • android: layout_gravity="fill_vertical" должен работать, но я надеюсь, что они исправит его в следующей версии. –  natario 12.06.2015 в 19:41
  • Я тоже использую библиотеку, и похоже, что с ней еще много проблем с размещением. –  Tommy Chan 18.06.2015 в 22:10

3 ответа

30

У меня была эта проблема и исправлено добавление:

android:layout_gravity="fill_vertical"

в NestedScrollView. Затем он начинает вести себя правильно, как я объяснил здесь . Конечно, NestedScrollView нуждается в каком-то дочернем элементе (т. Е. Он не должен быть пустым), иначе панель инструментов не рухнет.

Update

Пока это работает well с небольшим контентом, я заметил, что у него есть некоторые проблемы, показывающие более длительное содержимое, например. как полный activity_detail.xml выше. Проблема в том, что вы не можете прокручивать до самой нижней части содержимого - она ​​недоступна внизу.

В моих тестах я мог обнаружить, что недостающая часть имеет размер как сложенная панель инструментов (или, по крайней мере, это то, что мне кажется). Чтобы исправить это, проблема и наличие решения, надежного как для малого, так и для большого содержимого, вы должны добавить layout_marginBottom в ScrollView, чтобы он был измерен и выпустил недостающую нижнюю часть. Таким образом:

android:layout_gravity="fill_vertical"
android:layout_marginBottom="?attr/actionBarSize"

или любого другого размера, предоставленного Toolbar .

Но все же

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

Update2

Похоже, это было исправлено в v22.2.1.

    
ответ дан natario 12.06.2015 в 19:36
  • Это решение отлично работает! Я буду использовать его, пока не появится исправление от google –  Jan 17.06.2015 в 09:02
  • Я пробовал практически все решения, но это был единственный, который работал на меня. Благодаря..! –  Tushar Kathuria 15.01.2016 в 18:34
  • Нет такой удачи здесь. –  Luke Allison 09.03.2016 в 06:16
  • Отличное решение! Мне нравится это сообщество для крошечных бит, которые мы пропускаем, независимо от уровня Coder. Спасибо! –  sud007 29.07.2016 в 08:21
  • @Mike нет, теперь библиотека дизайна начинает казаться надежной. –  natario 18.10.2016 в 21:15
Показать остальные комментарии
-1

использовать 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)) {
            };
        }
    });
    
ответ дан 张小凡 12.06.2015 в 19:33
-1

Обход

Прежде чем показывать свой NestedScrollView и после привязки данных к содержимому NestedScrollView, я вызываю метод fullScroll (int direction) моего экземпляра NestedScrollView с направлением View.FOCUS_UP в качестве аргумента.

Пример кода для фрагмента:

NestedScrollView scrollView = (NestedScrollView) getActivity (). findViewById (R.id.scroll_view); scrollView.fullScroll (View.FOCUS_UP);     

ответ дан Jérôme 08.07.2015 в 22:49