подсказка и текстовое представление с правильной гравитацией и одной линией - PullRequest
8 голосов
/ 10 января 2011

Я открыл ошибку, но мне было интересно, если кто-нибудь сталкивался с этой проблемой и знает обходной путь.Если вы определяете текстовое представление с подсказкой внутри него, задайте правильную гравитацию (android: gravity = "right"), а затем, если вы определите android: singleLine = true или android: maxLines = "1" или android: scrollHorizonatally = "true"Вы не видите подсказку.удаление правой гравитации возвращает подсказку в левую сторону, удаление всех параметров дерева, о которых я упоминал выше, помещает подсказку в правую сторону.я хочу, чтобы моя подсказка была справа, но мне нужна одна горизонтальная линия ...

вот примерный макет, который не показывает подсказку:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">
            <EditText android:layout_width="fill_parent"
                android:layout_gravity="center_vertical|right"
                android:layout_height="wrap_content"
                android:layout_margin="6dp"
                android:textSize="16sp"
                android:paddingRight="5dp"
                android:id="@+id/c"
                android:gravity="right"
                android:hint="hello!!!"
                android:scrollHorizontally="true"
                android:maxLines="1"
                android:singleLine="true"/>
</LinearLayout>

Я проверил на 1.6 и2.1 эмуляторы и он воспроизводит 100%, я уверен, что это ошибка, я не вижу связи между одной строкой и подсказкой .... более того, подсказка получила свой собственный макет в TextView (mLayout и mHintLayout оба существуют, в onDraw, если длина текста 0 mHintLayout, если mHint не ноль, используется).

Ответы [ 7 ]

14 голосов
/ 11 мая 2011

Вы пробовали android:ellipsize="start"?Это прекрасно работало для меня в прошлом, когда я хотел, чтобы моя подсказка и EditText были в центре.

5 голосов
/ 11 января 2011

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

Самое простое решение - просто изменить макет, но это, вероятно, не то, что вы хотите сделать.Моя первая попытка обойти это было бы попытаться не устанавливать ни один из этих трех атрибутов в XML, а затем установить их в Java.Если это не сработает ...

Один из вариантов - имитировать подсказку, либо расширив класс EditText и попытавшись исправить код, который излагает подсказку, либо переопределив метод onDraw, чтобы создатьподсказка, или, возможно, просто перекрывая обычный TextView поверх EditText, который вы затем показываете / скрываете вручную.Вы можете даже проверить, пусто ли представление, и если да, установите текст в текст подсказки и измените цвет.Когда представление получает фокус, проверьте, соответствует ли его текст вашей подсказке, и, если это так, удалите текст и измените цвет обратно.

Другой возможный обходной путь, который немного более "хакерский", - это оставитьтри атрибута, которые вызывают проблемы, но попробуйте вручную предотвратить создание новой строки.Вам нужно создать OnKeyListener для вашего EditText, что-то вроде этого:

editText.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                // do nothing
                return true;
            }
            return false;
        }
    });

Вы также хотели бы вызвать editText.setImeOptions(EditorInfo.IME_ACTION_NEXT), чтобы не показывать ключ возврата.Тем не менее, возможно, можно создать новую строку в текстовом поле, вставив в нее или каким-либо другим способом, поэтому вы также захотите проанализировать и удалить новые строки, когда форма отправлена ​​просто для безопасности.Это также вряд ли будет делать то, что вы хотите, насколько горизонтальная прокрутка.

2 голосов
/ 26 сентября 2011

используйте эти свойства с подсказкой и одной строкой ... вы можете изменить гравитацию !!

            android:gravity="right"
            android:ellipsize="start"
            android:imeOptions="actionNext"             
            android:singleLine="true"
1 голос
/ 04 февраля 2013

Noting сработал достаточно хорошо для меня. Когда я установил Gravity.right, курсор всегда был справа и не мог быть помещен в середину слова.

Я попробовал другой подход - установите гравитацию вправо, когда текста нет (или влево, если он работает для вас), и пусть Android определит наилучшее направление, когда пользователь введет что-то

Это сработало для меня:

  1. создать TextWatcher класс

    private static class FilterTextWatcher implements TextWatcher {
    
        private WeakReference<Activity> mActivity;
    
        public FilterTextWatcher(Activity activity) {
            mActivity = new WeakReference<Activity>(activity);
        }
    
        public void afterTextChanged(Editable s) {
        }
    
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
    
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (mActivity.get() == null)
                return;
    
            EditText searchTxtBx = mActivity.get().mSearchTxtBx;
            if (searchTxtBx.getText().toString().length() == 0)
                searchTxtBx.setGravity(Gravity.RIGHT);
            else
                searchTxtBx.setGravity(0);
        }
    }
    
  2. используйте это как член класса

    private TextWatcher mFilterTextWatcher = new FilterTextWatcher(this);
    
  3. в onCreate():

    mSearchTxtBx.addTextChangedListener(mFilterTextWatcher);
    
  4. in onDestroy():

    mSearchTxtBx.removeTextChangedListener(mFilterTextWatcher);
    mFilterTextWatcher = null;
    
0 голосов
/ 11 марта 2014

Я заметил эту проблему, когда мои атрибуты TextView:

android:singleLine="true"  
android:gravity="right"

Когда я пытаюсь связать textview или setMovementMethod (LinkMovementMethod.getInstance ()) для этого textview, текст просто исчезает.

android:ellipsize="start" 

решил мою проблему, потому что я использую арабский текст в своем приложении.

0 голосов
/ 13 сентября 2012

это сработало со мной, когда я добавил:

android:hint="the hint text ..."
android:singleLine="true"
android:ellipsize="start"

и в своей деятельности я добавил:

myedittext.setOnKeyListener(new OnKeyListener() {
    @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
          if(keyCode==KeyEvent.KEYCODE_ENTER&&event.getAction()==KeyEvent.ACTION_DOWN){
                    // do nothing
                    return true;
                }
          return false;
    }
});
0 голосов
/ 08 февраля 2011

Что вы думаете о моем решении этой проблемы?

editText.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus == false && StringUtils.isNotBlank(editText.getText().toString())) {
                editText.setGravity(Gravity.RIGHT);
            }
        }
    });

И соответствующий XML-файл:

<EditText android:id="@+id/the_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="number" android:hint="@string/edit_text_prompt"/>

У меня отлично работает: только одна строка, без вводаклавиша возможна, показывает подсказку, и когда я покидаю поле после того, как был введен какой-либо ввод, текст отображается по правому краю.

...