Desplazamiento de EditText dentro de ScrollView

Tengo un desagradable problema. Tengo EditText (8 líneas) dentro de ScrollView . Y cuando bash desplazar el texto en EditText , su comportamiento no es estable. A veces se desplaza, algunas veces no enfoca.

Este es mi archivo de diseño, para hacer que mi pregunta sea más clara:

     

Entiendo que tengo este problema porque tengo un control desplazable dentro de otro, pero no sé qué hacer con esto. Entonces, por favor ayudame si puedes.

Gracias por adelantado.

 public void initComments(final View view) { EditText comment = (EditText) view.findViewById(R.id.wo_task_comments); comment.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(final View v, final MotionEvent motionEvent) { if (view.getId() == R.id.wo_task_comments) { view.getParent().requestDisallowInterceptTouchEvent(true); switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_UP: view.getParent().requestDisallowInterceptTouchEvent( false); break; } } return false; } }); comment.setText(currentTask.getComment() + "very very long comment" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment"); } 

Lo intenté y no obtuve ningún resultado. Todavía no puedo desplazar mi editbox.

Tratar:

 @Override public void onCreate(Bundle savedInstanceState) { ..... EditText et = (EditText)findViewById(R.id.wo_task_comments); et.setOnTouchListener(this); ..... } @Override public boolean onTouch(View view, MotionEvent motionEvent) { if(view.getId() == R.id.wo_task_comments){ view.getParent().requestDisallowInterceptTouchEvent(true); switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_UP: view.getParent().requestDisallowInterceptTouchEvent(false); break; } } return false; } 

En tu caso:

 public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); initComments(findViewById(R.id.YOUR_MAIN_LAYOUT_ID)); } public void initComments(final View view) { EditText comment = (EditText) view.findViewById(R.id.wo_task_comments); comment.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(final View v, final MotionEvent motionEvent) { if (v.getId() == R.id.wo_task_comments) { v.getParent().requestDisallowInterceptTouchEvent(true); switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_UP: v.getParent().requestDisallowInterceptTouchEvent( false); break; } } return false; } }); comment.setText("very very long comment" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment\n" + "very very long comment"); } 

}

El código de Shilkin funciona muy bien. Lo hago un poco más fuerte. Ahora maneja la situación de que el padre directo de EditText no es el ScrollView (por ejemplo, EditText está envuelto en LinearLayout antes de ponerlo en la vista de desplazamiento).

El código del método:

 public static void handleEditTextScrollable(EditText editText, final int resId) { editText.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (v.getId() == resId) { ViewParent parent = v.getParent(); while (!(parent instanceof ScrollView)) { parent = parent.getParent(); } parent.requestDisallowInterceptTouchEvent(true); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_UP: parent.requestDisallowInterceptTouchEvent(false); break; } } return false; } }); } 

Llámalo así:

 handleEditTextScrollable(comment, R.id.wo_task_comments); 

Una opción es establecer el alto del niño EditText como el alto de las líneas máximas totales (max_lines * font_height). Por lo tanto, el desplazamiento interno estará desactivado y el único desplazamiento será el desplazamiento principal.