1

Я пытаюсь создать EditText, в котором текст не может быть выбран, но который все еще может быть просмотрен пользователем. Для архивирования первой функции сотворенный обычая OnTouchListener и только ответил на ACTION_DOWN событие, как это:EditText: разрешить прокрутку, но отключить выбор

View.OnTouchListener otl = new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        scroll_down_x = event.getX(); 
        Layout layout = ((EditText) v).getLayout(); 
        float x = event.getX() + mText.getScrollX(); 
        int offset = layout.getOffsetForHorizontal(0, x); 
        if(offset>0) 
         if(x>layout.getLineMax(0)) 
          mText.setSelection(offset);  // touch was at end of text 
         else 
          mText.setSelection(offset - 1); 
        break; 
     } 
     return true; 
    } 
}; 
mText.setOnTouchListener(otl); 

Но это также отключить скроллинг. Я тогда попытался reimplement в ACTION_MOVE события с

   case MotionEvent.ACTION_MOVE: 
        String input = ((EditText)v).getText().toString(); 
        float width = ((EditText) v).getPaint().measureText(input); 
        float cwidth = ((EditText)v).getWidth(); 
        //only scroll when the text is too long for the control 
        if (width >cwidth) 
        { 
         layout = ((EditText) v).getLayout(); 

         x = event.getX() - scroll_down_x; 
         offset = layout.getOffsetForHorizontal(0, x); 
         mText.scrollBy((int) x, mText.getScrollY()); 
        } 
        return true; 

Но это не работает вообще - прокрутка не очень гладко и очень неточно. Итак, как я могу улучшить этот «прокручиваемый» -код или решить проблему EditText, в которой текст не может быть выбран, но пользователь все еще может прокручивать?

РЕДАКТИРОВАТЬ: Также пользователь должен по-прежнему изменять положение курсора.

ответ

0

После некоторых более экспериментирования я, наконец, мысли о чем-то работе.

final EditText mText = (EditText) findViewById(R.id.input); 
View.OnTouchListener otl = new View.OnTouchListener() { 
    private float scroll_down_x; 
    final static int right_border = 20; 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      scroll_down_x = event.getX(); 
      Layout layout = ((EditText) v).getLayout(); 
      float x = event.getX() + mText.getScrollX(); 
      int offset = layout.getOffsetForHorizontal(0, x); 
      if(offset>0) 
       if(x>layout.getLineMax(0)) 
        mText.setSelection(offset);  // touch was at end of text 
       else 
        mText.setSelection(offset - 1); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      String input = ((EditText)v).getText().toString(); 
      float width = ((EditText) v).getPaint().measureText(input); 
      float cwidth = ((EditText)v).getWidth(); 

      //only scroll when the text is too long for the control 
      if (width >= cwidth) { 
       layout = ((EditText) v).getLayout(); 
       x = event.getX() - scroll_down_x; 
       scroll_down_x = event.getX(); 
       //do not scroll over the left border 
       if (((EditText) v).getScrollX() + (int)x >= 0) { 
        //do not scroll over the right border 
        if ((int)cwidth+((EditText) v).getScrollX()-right_border + x <= (int)width) 
        { 
         offset = layout.getOffsetForHorizontal(0, x); 
         mText.scrollBy((int) x, 0); 
        } 
        else 
        { 
         mText.scrollTo((int)(width-cwidth+right_border), 0); 
        } 
       } 
       else 
       { 
        mText.scrollTo(0, 0); 
       } 
      } 
     } 
     return true; 
    } 
}; 

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

-1

если вы хотите показать какую-либо информацию без редактирования его, вы можете использовать TextView (см этот пост https://stackoverflow.com/a/3256305/2697368) вместо EditText, но если вы хотите EditText, попробуйте использовать ниже код:

<EditText 
    android:id="@+id/edittext" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:cursorVisible="false" 
    android:focusable="false" 
    android:inputType="textMultiLine" 
    android:scrollbars="vertical" 
    android:text="Long Text here" /> 

Если вы хотите включить пользователь издание, используйте этот код:

EditText edittext = (EditText) findViewById(R.id.edittext); 

edittext.setCustomSelectionActionModeCallback(new ActionMode.Callback() { 

    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 

    public void onDestroyActionMode(ActionMode mode) { 
    } 

    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 

    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     return false; 
    } 
}); 
} 
+0

Это действительно не решает проблему, потому что пользователь все еще может выбирать части текста - только кнопки команды для их копирования или совместного использования исчезли. – FlashTek

+0

Какая версия Android вы проверили мое решение? – Gorio

+1

Посмотрите мое решение в этом видео https://vimeo.com/161860272 – Gorio