1

J'essaye de créer un EditText dans lequel aucun texte ne peut être choisi, mais qui peut toujours être examiné par l'utilisateur. Pour archiver la première fonction a créé une coutume OnTouchListener et seulement répondu aux ACTION_DOWN événements comme celui-ci:EditText: permet de faire défiler mais de désactiver la sélection

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); 

Mais cela ne désactivera également le défilement. Je l'ai ensuite essayé de reimplement les événements ACTION_MOVE avec

   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; 

Mais cela ne fonctionne pas du tout - le défilement est pas très lisse et très imprécis. Alors, comment puis-je améliorer ce "scrolling" -code ou résoudre le problème d'un EditText dans lequel aucun texte ne peut être sélectionné mais l'utilisateur peut encore faire défiler?

EDIT: L'utilisateur doit également être en mesure de changer la position du curseur.

Répondre

0

Après un peu plus expérimenter, j'ai finalement pensé à quelque chose de travail.

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; 
    } 
}; 

Ce code permet à l'utilisateur de régler le curseur et pour faire défiler une bordée EditText et il cachera le clavier du système. J'espère que ça va aider quelqu'un. Je suis toujours intéressé s'il n'y a pas un moyen plus pratique d'archiver ce comportement.

-1

si vous souhaitez afficher des informations sans le modifier, vous pouvez utiliser un TextView (voir ce post https://stackoverflow.com/a/3256305/2697368) au lieu de EditText, mais si vous voulez un EditText, essayez d'utiliser ci-dessous le code:

<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" /> 

Si vous souhaitez activer l'édition de l'utilisateur, utilisez ce code:

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

Cela ne résout pas vraiment le problème car l'utilisateur est toujours capable de sélectionner des parties du texte - seuls les boutons de commande pour le copier ou le partager ont disparu. – FlashTek

+0

Quelle version d'Android avez-vous testé ma solution? – Gorio

+1

Regardez ma solution dans cette vidéo https://vimeo.com/161860272 – Gorio