Как сделать так, чтобы ScrollView не прокручивался вниз при изменении ориентации?

У меня есть LinearLayout, который отлично работает при изменении ориентации. Затем я обернул LinearLayout в ScrollView, и теперь у меня проблема. Вертикальная прокрутка работает нормально, но при изменении ориентации в ландшафтный режим вид немного прокручивается вниз, поэтому теперь верхняя часть макета обрезается. ScrollView, похоже, отвечает на код requestFocus() в строке EditText, которая находится чуть ниже верхней части представления. Но View достаточно большой, чтобы показать верхнюю часть View и строку EditText. Как заставить вид после изменения ориентации не прокручиваться вниз, чтобы он мог отображать верхнюю часть макета и строку EditText?

файл частичного макета:

?xml version="1.0" encoding="utf-8"?>

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:focusableInTouchMode="true"
tools:context=".CardViewActivity">

<include
    android:id="@+id/toolbar"
    layout="@layout/toolbar" >
</include>

<ScrollView
    android:id="@+id/ScrollView1"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"  >

<LinearLayout
    android:id="@+id/LinearLayout1"
    style="@style/scrollbar_shape_style"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/rounded_corner"
    android:layout_marginLeft="6dp"
    android:layout_marginStart="6dp"
    android:layout_marginRight="6dp"
    android:layout_marginEnd="6dp"
    android:layout_marginTop="6dp"
    android:layout_marginBottom="6dp"
    android:useDefaultMargins="false"
    android:orientation="vertical"  >
    ...

частичный файл активности:

...
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.cardviewinput);

    cListenerEditText = (ListenerEditText) findViewById(R.id.CEditText);
    cListenerEditText.requestFocus();

person AJW    schedule 13.09.2015    source источник


Ответы (1)


Поместите следующий атрибут в тег активности в AndroidManifest.xml android:windowSoftInputMode="adjustPan"

person Aditya Naique    schedule 13.09.2015
comment
В настоящее время у меня установлено значение stateVisible|adjustResize, потому что я использую программную клавиатуру для пользовательского ввода, который отображается под основным видом. Мысли? - person AJW; 13.09.2015
comment
Попробуйте изменить его на stateVisible|adjustPan. - person Aditya Naique; 13.09.2015
comment
Хорошо, я попробую это. Что будет делать AdjustPan, а не AdjustResize? - person AJW; 13.09.2015
comment
Ok. И причина того, что изменение на AdjustPan было бы не менее желательным, заключается в том, что ScrollView позволяет пользователю просто прокручивать вниз, чтобы увидеть оставшиеся части представления? - person AJW; 13.09.2015
comment
О да, только что понял эту проблему. Я предполагаю, что в этом случае единственным решением является нажатие пользователем клавиши NEXT на клавиатуре, чтобы перейти к следующему editText, или нажатие DONE, чтобы закрыть клавиатуру. - person Aditya Naique; 13.09.2015
comment
Но подождите, может быть, я не ясно выразился. Я думаю, что AdjustPan с программной клавиатурой может быть проблемой с макетом, в котором нет ScrollView. Поскольку макет, который я использую, имеет ScrollView, то AdjustPan, кажется, работает нормально, чтобы сохранить View вверху с фокусом на первой строке EditText. Затем, если пользователь хочет прокрутить вниз до оставшихся строк EditText, он может это сделать. Итак, есть ли какие-либо недостатки в использовании AdjustPan в моем случае? - person AJW; 13.09.2015
comment
Да, этот ответ правильный - AdjustPan не очень удобен для UX. Только что попробовал это в моем макете, который использует scrollView, и он не позволяет мне прокручивать ниже EditText в фокусе. С другой стороны, AdjustResize работает нормально. - person Aditya Naique; 13.09.2015
comment
Хорошо, я переустановлю обратно, чтобы настроитьResize. Будет ли способ получить фокус в верхней части представления при изменении ориентации (использовать невидимый виджет?), чтобы представление отрисовывалось правильно, а затем переместило фокус вниз на первую строку EditText? - person AJW; 13.09.2015
comment
эй, извините, что смущаю вас :), если в вашем случае AdjustPan работает нормально, то, во что бы то ни стало, продолжайте. Минусов в использовании нет. - person Aditya Naique; 13.09.2015
comment
AdjustPan - это не то, что я ищу, потому что он не позволяет прокручивать вниз до нижних частей представления. Я должен найти решение с AdjustResize... есть мысли? - person AJW; 13.09.2015
comment
Проверьте выбранный ответ в этой теме stackoverflow.com/q/22141168/1944049 - person Aditya Naique; 13.09.2015
comment
Я читал ветку. Одно отличие в том, что у меня всегда открыта клавиатура. Так что не уверен, чем нить может помочь... что вы думаете? - person AJW; 13.09.2015