Подтвердить что ты не робот

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

4b9b3361

Ответ 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);