1

'u seçmeyi devre dışı bırakma EditText'u hiçbir metin seçilemiyorum ama kullanıcı tarafından hala okunabilir. bir özel bir OnTouchListener oluşturulan ve sadece böyle ACTION_DOWN olaylara yanıt ilk fonksiyonu arşivlemek için:EditText: kaydırmaya izin ver ancak

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

Ama bu da kaydırma devre dışı gelmez. Sonra

   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; 

ile ACTION_MOVE olayları reimplement çalıştık Ama bu hiç çalışmıyor - kaydırma çok düzgün ve aynı zamanda çok yanlış değil. Peki, bu "kaydırma" kodunu nasıl düzeltebilirim veya EditText sorusunu çözebilir, ancak hiçbir metin seçilemez ancak kullanıcı yine de kayıyor olabilir mi?

DÜZENLEME: Ayrıca, kullanıcı yine de imleç konumunu değiştirebilir. Eğer, bir TextView kullanabilirsiniz düzenlemek olmadan herhangi bir bilgi göstermek istiyorsanız

cevap

0

: Eğer kullanıcı sürümünü etkinleştirmek istiyorsanız, bu kodu kullanın.

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

Bu kod kullanıcı imleci ayarlamak ve bir birinden gezinmek için EditText astarlı ve sistem klavyesini gizler verir. Umarım birilerine yardım eder. Bu davranışı arşivlemek için daha uygun bir yol olmadığını merak ediyorum.

-1

yerine EditText ait (bu yazı https://stackoverflow.com/a/3256305/2697368 bakınız), ancak bir EditText istiyorsanız kodunun altına kullanmayı deneyin:

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

biraz daha sonunda bir şey çalışma düşündüm denedikten sonra

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

Bu, kullanıcının metni hala seçebildiği için sorunu gerçekten çözmez; yalnızca kopyalamak veya paylaşmak için komut düğmelerinin yok olması. – FlashTek

+0

Android'in hangi sürümü çözümümüzü test ettiniz? – Gorio

+1

Bu videoda çözümüme bakın https://vimeo.com/161860272 – Gorio

İlgili konular