1

В настоящее время я разрабатываю простую программу Notes, в которой пользователь может ввести заголовок и содержание своей заметки. То, что я хочу достичь, - это то, что когда пользователь нажимает на содержимое заметки (EditText), появляется мягкая клавиатура, и только содержимое заметки EditText уменьшается в размере (изменяется), а все остальное остается в том же положении.EditText AdjustResize форсирование содержимого вне поля зрения

Моя текущая реализация можно увидеть ниже:

Manifest:

<activity android:theme="@style/AppTheme" 
     android:name=".AddActivity" 
     android:label="@string/add_record" 
     android:windowSoftInputMode="adjustResize" 
     android:parentActivityName=".MainActivity" 
     android:excludeFromRecents="true"/> 

XML - Добавить активность

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/add_record" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:padding="20dp"> 

    <EditText 
     android:id="@+id/title_edittext" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:hint="@string/enter_title" 
     android:inputType="textCapSentences" 
     android:textColor="@color/fontPrimary" 
     android:theme="@style/EditTextCustomCursor"> 

     <requestFocus /> 
    </EditText> 

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/modify_scrollview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:fitsSystemWindows="false" 
     android:isScrollContainer="false" 
     android:fillViewport="true"> 

     <EditText 
      android:id="@+id/note_edittext" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="@null" 
      android:ellipsize="end" 
      android:gravity="top|left" 
      android:hint="@string/enter_note" 
      android:inputType="textCapSentences|textMultiLine" 
      android:paddingLeft="5dp" 
      android:scrollHorizontally="false" 
      android:textColor="@color/fontPrimary" 
      android:theme="@style/EditTextCustomCursor" /> 
    </ScrollView> 

</LinearLayout> 

Java - Добавить активность

private int screenHeight; 
private int actionBarHeight = 350; 
private int keyboardHeight; 

...

private void setupListeners() { 

    final LinearLayout layout = (LinearLayout) findViewById(R.id.add_record); 
    layout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      Rect r = new Rect(); 
      layout.getWindowVisibleDisplayFrame(r); 

      screenHeight = layout.getRootView().getHeight(); 
      keyboardHeight = screenHeight - (r.bottom - r.top); 
      Log.d("Keyboard Size", "Size: " + keyboardHeight); 

     } 
    }); 

    KeyboardVisibilityEvent.setEventListener(
      AddActivity.this, 
      new KeyboardVisibilityEventListener() { 
       @Override 
       public void onVisibilityChanged(boolean isOpen) { 

        if (isOpen) { 
         Log.d("KB", "openKeyboard"); 
         scrollView.setLayoutParams(new LinearLayout.LayoutParams(
           LinearLayout.LayoutParams.FILL_PARENT, screenHeight - actionBarHeight - keyboardHeight)); 
        } else { 
         Log.d("KB", "closeKeyboard"); 
         scrollView.setLayoutParams(new LinearLayout.LayoutParams(
           LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); 
        } 
       } 
      }); 
} 

Это использование библиотеки клавиатуры (https://github.com/yshrsmz/KeyboardVisibilityEvent) для обнаружения, когда клавиатура открыта или закрыта. Это работает отлично, и высота/макет настраивается так, как я хочу, чтобы он выглядел, но только если пользователь нажимает на верхнюю часть EditText. Если пользователь нажимает на нижнюю часть EditText (если они ввели длинную заметку), то весь макет подталкивается вверх, оставляя большой пробел в нижней части страницы.

Таким образом, есть ли способ, как везде в EditText/ScrollView пользователь нажимает, так как он только настраивает один EditText по высоте и оставляет другой EditText на месте в верхней части экрана, не нажимая его и SupportActionBar вне поля зрения? Кроме того, ScrollView используется для создания вертикальной полосы прокрутки в правой части экрана - если такое же поведение может быть достигнуто с помощью только EditText, тогда я бы полностью удалил ScrollView.

EDIT - Добавить фото

Изображение 1: Длинное содержание примечания (в нижней части содержания ноты находятся в нижней части Scrollview (который нельзя увидеть, пока не прокручиваются))

Clicking top half of note EditText

Изображение 2: одно и то же примечание, но щелкнув внизу, заставляет верхний EditText и Support ActionBar отсутствовать, оставив пробел внизу.

Clicking bottom half of note EditText

Пояснение: Где подсвечивается F (в Image 2), что в нижней части EditText/ScrollView, так что вы можете увидеть большой разрыв, созданный между верхней мягкой клавиатуры и нижней части EditText/ScrollView

Желаемое поведение: нажатие в любом месте в нижней части EditText должно только изменять размер этого конкретного EditText, чтобы освободить место для мягкой клавиатуры и убедиться, что этот EditText находится над мягкой клавиатурой, чтобы пользователь мог видеть, что они печатают, top EditText остается в одном месте.

+1

Вы можете добавить скриншот к себе, как его вести себя сейчас и как вы хотите! – shadygoneinsane

+0

какая версия для Android? –

+0

@PratikPopat в настоящее время тестирует на Lollipop & Marshmallow; оба имеют одинаковое поведение. –

ответ

0

мне удалось решить большинство из этого, выполнив следующие действия:

  • Удаление Scrollview
  • подклассов EditText (получить кнопку закрытия клавиатуры)
  • Добавление высоты изменения слушателя
  • Добавление свойства полосы прокрутки в EditText

Манифест:

<activity android:theme="@style/AppTheme" 
     android:name=".AddActivity" 
     android:label="@string/add_record" 
     android:windowSoftInputMode="adjustNothing" 
     android:parentActivityName=".MainActivity" 
     android:excludeFromRecents="true"/> 

XML - Добавить активность:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/add_record" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:padding="20dp" 
    android:windowSoftInputMode="stateHidden"> 

    <EditText 
     android:id="@+id/title_edittext" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:ems="10" 
     android:hint="@string/enter_title" 
     android:inputType="textCapSentences" 
     android:textColor="@color/fontPrimary" 
     android:theme="@style/EditTextCustomCursor"> 

     <requestFocus /> 
    </EditText> 

    <com.securenotes.ExtendedEditText 
     android:id="@+id/note_edittext" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:ellipsize="end" 
     android:gravity="top|left" 
     android:hint="@string/enter_note" 
     android:inputType="textCapSentences|textMultiLine" 
     android:lines="50" 
     android:maxLines="20" 
     android:minLines="5" 
     android:paddingLeft="5dp" 
     android:scrollHorizontally="false" 
     android:scrollbars="vertical" 
     android:textColor="@color/fontPrimary" 
     android:theme="@style/EditTextCustomCursor" /> 

</LinearLayout> 

Java - добавить активность:

private Boolean initialStart = true; 
private Boolean isOpened = false; 

... 

private void setupListeners() { 

    final View activityRootView = getWindow().getDecorView().findViewById(android.R.id.content); 
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 

      int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); 
      Log.d("KB", "HeightDiff: " + heightDiff); 
      if (heightDiff > 100) { // 99% of the time the height diff will be due to a keyboard. 

       if (!isOpened && initialStart) { 
        Log.d("KB", "1) openKeyboard"); 
        //Do two things, make the view top visible and the editText smaller 
        noteEditText.setLines(15); 
        noteEditText.requestLayout(); 
        initialStart = false; 
        isOpened = true; 
       } else if (!isOpened && noteEditText.hasFocus()) { 
        Log.d("KB", "2) openKeyboard"); 
        //Do two things, make the view top visible and the editText smaller 
        noteEditText.setLines(15); 
        noteEditText.requestLayout(); 
        isOpened = true; 
       } 
      } 
     } 
    }); 

    noteEditText.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("KB", "EditText onClick"); 
      isOpened = false; 
     } 
    }); 

    noteEditText.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
       Log.d("KB", "closeKeyboard"); 
       noteEditText.setLines(50); 
       noteEditText.requestLayout(); 
      } 
      return false; 
     } 
    }); 
} 

Java - подклассы EditText:

public class ExtendedEditText extends EditText { 

    public ExtendedEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

    } 

    public ExtendedEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 

    } 

    public ExtendedEditText(Context context) { 
     super(context); 

    } 

    @Override 
    public boolean onKeyPreIme(int keyCode, KeyEvent event) { 
     if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
      dispatchKeyEvent(event); 
      return false; 
     } 
     return super.onKeyPreIme(keyCode, event); 
    } 

} 

Однако один оставшийся вопрос является что если пользователь прокручивает EditText, иногда это d делает его кликом, а не свитком, поэтому клавиатура становится видимой, а макет (количество строк) изменяется. Я посмотрел на onScrollChangeListener, но для этого требуется API 23, а мой текущий минимум - 15 - есть ли способ обойти это, чтобы определить разницу между прокруткой и фактическим нажатием на EditText?

+1

отличное и да свойство полосы прокрутки для edittext i fo rgot, чтобы упомянуть последний раз.и для последней проблемы, о которой вы упомянули, я мог бы предложить добавить некоторое дополнение к scrollbar thumb, применяя к нему стиль с этим свойством xml android: scrollbarStyle = «YourCustomScrollBarStyle» добавить «YourCustomScrollBarStyle» в свои стили и добавить там тег дополнений. что может решить проблему. потому что это увеличит зону касания для полосы прокрутки. –

1

Это потому, что вы добавляете edittext в виде прокрутки. почему вам даже нужен просмотр прокрутки? просмотр прокрутки имеет свойство перехода к определенной строке, когда всплывающее окно клавиатуры вызывает это поведение. если вы действительно хотите использовать scrollview, а затем добавьте мастер-макет как scrollview. добавьте туда одного прямого ребенка или его линейный макет и добавьте все содержимое в этот линейный макет.

+0

Как было описано в моем вопросе, ScrollView используется для достижения полосы прокрутки с правой стороны (при прокрутке полосы прокрутки отображается с правой стороны) - может ли это быть достигнуто только с помощью EditText? И я уже пробовал устанавливать ScrollView в качестве основного макета, но это вызывает дополнительные проблемы, так как когда пользователь вводит текст (в примечании EditText), он прокручивает страницу и по-прежнему вытесняет верхний EditText и Support ActionBar из вида, осуществление не делает. В настоящее время он только вытесняется из поля зрения при нажатии на нижнюю часть ScrollView. –

+1

Да, я знаю, почему вам нужна эта полоса прокрутки. и если вы добавите многострочный тег в свой edittext, он автоматически покажет полосы прокрутки. нет необходимости добавлять Scrollview для этого .. это то, что я использую для этого длинного сообщения EditText андроида: inputType = "textMultiLine" андроид: строки = "8" андроид: MaxLines = "10" андроид: minLines =» 6 " –

+0

Я полностью удалил ScrollView и, используя минимальные строки, не позволяет помещать содержимое вверх, но мне нужна строка прокрутки справа (не отображается при прокрутке EditText), заметка EditText, чтобы заполнить все доступного пространства, когда клавиатура закрыта, а также при прокрутке EditText иногда он думает, что это щелчок и показывает клавиатуру вместо прокрутки (не было этой проблемы с ScrollView). –

Смежные вопросы