2012-03-19 32 views
7

Mam nieprzyjemny problem. Mam EditText (8 linii) wewnątrz ScrollView. A gdy próbuję przewinąć tekst w pliku EditText, jego zachowanie nie jest stabilne. Czasami jest przewijany, czasami nie jest skupiony.Przewijanie EditText wewnątrz ScrollView

To jest mój plik układ, aby moje pytanie bardziej jasne:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="8dp" > 

    <TextView 
     android:id="@+id/wo_task_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/no_description" /> 

    <TextView 
     android:id="@+id/wo_task_description" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/no_description" /> 

    <TextView 
     android:id="@+id/wo_task_comments_label" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="10dp" 
     android:text="@string/comments" /> 

    <Button 
     android:id="@+id/wo_task_select_comment" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/select_comment_from_template" /> 

    <EditText 
     android:id="@+id/wo_task_comments" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="top|left" 
     android:hint="@string/enter_your_comment_here" 
     android:lines="8" 
     android:maxLines="10" 
     android:minLines="6" 
     android:scrollbars="vertical" 
     android:singleLine="false" /> 
</LinearLayout> 

Rozumiem, że mam ten problem z powodu posiadania jednej przewijalną kontrolę wewnątrz drugiego, ale nie wiem, co z tym zrobić. Więc proszę, pomóż mi, jeśli możesz.

Z góry dziękuję.

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

Próbowałem tego, i bez rezultatu. Nadal nie mogę przewinąć mojego pola edycji.

Odpowiedz

28

Spróbuj:

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

W twoim przypadku:

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

}

+0

właśnie zaksięgowania samą odpowiedź, jako dodatek być może trzeba wyłączyć inne przewijanie otherviews.setOnTouchListener (nowa OnTouchListener() { \t \t \t public onolean boolean (Zobacz v, zdarzenie MotionEvent) { \t \t \t \t return true; \t \t \t} \t \t}); – Ceetn

+0

dzięki za odpowiedź. W tej chwili wciąż nie jestem w stanie rozwiązać mojego problemu. – Orest

+0

Zaktualizowałem moje pytanie. – Orest

-1

Jedną z opcji jest, aby ustawić wysokość dziecka EditText w wysokości całkowitych linii Max (max_lines * font_height). Wewnętrzny zwój zostanie wyłączony, a jedynym zwojem będzie przewijany nadrzędny.

0

Kod Shilkina działa świetnie. Sprawia, że ​​jest trochę silniejszy. Teraz radzi sobie z sytuacją, że bezpośrednim rodzicem EditText nie jest ScrollView (np. EditText jest zawijany w LinearLayout przed umieszczeniem w przewijanym wierszu).

Kod metoda:

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

nazwać to tak:

handleEditTextScrollable(comment, R.id.wo_task_comments); 
Powiązane problemy