2012-07-20 59 views
1

我已经使用此方法,android.text.Selection.setSelection(Spannable text,int index),在MyEditText中选择一些文本,自定义类继承EditText,while移动我的手指。它在单个视图中完美运行,但是当我将它应用于ListView中的多个MyEditText项时,它无法正常工作。无法在列表视图项中正确选择文本

以下是我的代码,你也可以下载它形成的github(https://github.com/ruobin/unconstrained-selecting-texts):

MyEditText.java

public class MyEditText extends EditText { 

    public MyEditText(Context context) { 
     super(context); 
     initialize(); 
    } 

    public MyEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     initialize(); 
    } 

    public MyEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initialize(); 
    } 

    private void initialize() { 
     setBackgroundColor(Color.WHITE); 
    } 

    @Override 
    protected void onCreateContextMenu(ContextMenu menu) { 
     // avoid to pop out the context menu 
    } 

    @Override 
    public boolean getDefaultEditable() { 
     return false; 
    } 

    private int offset; 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     int action = event.getAction(); 
     Layout layout = getLayout(); 
     int line = 0; 
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      line = layout.getLineForVertical(getScrollY() + (int) event.getY()); 
      offset = layout.getOffsetForHorizontal(line, (int) event.getX()); 
      Selection.setSelection(getEditableText(), offset); 
      break; 
     case MotionEvent.ACTION_MOVE: 
     case MotionEvent.ACTION_UP: 
      line = layout.getLineForVertical(getScrollY() + (int) event.getY()); 
      int curOff = layout 
        .getOffsetForHorizontal(line, (int) event.getX()); 
      Selection.setSelection(getEditableText(), offset, curOff); 
      break; 
     } 
     return true; 
    } 

} 

MyListAdapter.java

public class MyListAdapter extends BaseAdapter { 

    private ArrayList<String> entitys; 
    private Context context; 

    public MyListAdapter(Context context, ArrayList<String> entitys) { 
     this.context = context; 
     this.entitys = entitys; 
    } 

    @Override 
    public int getCount() { 
     if (entitys == null) 
      return 0; 
     return entitys.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     if (entitys == null) 
      return null; 
     return entitys.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     String entity = entitys.get(position); 
     MyEditText myTextView = (MyEditText) View.inflate(context, 
       R.layout.list_item, null); 
     myTextView.setText(entity); 
     return myTextView; 
    } 

} 

CopyTextTest2Activity.java

public class CopyTextTest2Activity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     LinearLayout ll = new LinearLayout(this); 
     ListView lv = new ListView(this); 
     String values; 

     ArrayList<String> stringList = new ArrayList(); 
     for (int i = 0; i < 10; i++) { 
      values = "" + i + " sdfsfjskldfhsklhskdfsdhf" 
        + "fsdfaskhfkshdfkskdfskldf" 
        + "dfskdfhkshdfkshdkiuiouweoruweoruwoeruwoer" 
        + "opkspdfmmbb" + "" + "dsfasdfsdfsdfsdferwre"; 
      stringList.add(values); 
     } 

     MyListAdapter myAdapter = new MyListAdapter(this, stringList); 
     lv.setAdapter(myAdapter); 
     lv.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); 

     ll.addView(lv, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 
     // lv.setEnabled(false); 
     setContentView(ll); 

    } 
} 

list_item.xml

​​3210

当你运行这个项目,你会在ListView只找到的第一个项目是可选择的,另一个奇怪的是,你不能选择全部你包围的文字。

我认为onTouchEvent与listview的滚动移动不兼容,但我无能为力。

真的希望有人能帮助我!

回答

1

我的意见是onTouchEvent与列表视图的滚动 移动不兼容,但我无能为力。

要解决此问题,请覆盖Activity.dispatchTouchEvent()(http://developer.android.com/reference/android/app/Activity.html#dispatchTouchEvent(android.view.MotionEvent)并将其传递给您的ListView并最终传递给您的View。让它首先做好工作。然后让View系统完成它的工作。

+0

我不完全理解你的意图,你会给我一些细节或伪代码吗? – 2012-07-20 07:49:29

相关问题