2012-03-19 10 views
7

Kötü bir sorunum var. ScrollView içinde EditText (8 satır) var. Ve EditText'da metni kaydırmaya çalıştığımda, davranış kararlı değil. Bazen kayıyor, bazen odaklanma değil.İçerisinde EditText'i kaydırmak ScrollView

Bu benim düzen dosyasıdır, sorum daha açık hale getirmek için:

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

ben çünkü diğerinin içine bir kaydırılabilir kontrolünü elinde bu sorun yaşıyorum anlamak, henüz bununla ne yapacağımı bilmiyorum. Öyleyse, lütfen bana yardım edin.

Şimdiden teşekkürler.

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

Bunu denedim ve sonuç yok. Düzenleme kutumu kaydırmaya devam edemiyorum.

cevap

28

Dene: Senin durumunda

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

:

+0

sadece belki diğer kaydırma otherviews.setOnTouchListener devre dışı bırakmak zorunda ek olarak, aynı cevabı gönderme miydi (yeni OnTouchListener() { \t \t \t public boolean onTouch (View v, MotionEvent olayı) { \t \t \t \t true; \t \t} \t \t}); – Ceetn

+0

Yanıt için teşekkürler. Şu an için hala problemimi çözemiyorum. – Orest

+0

Sorumu güncelledim. – Orest

-1

Bir Seçenek toplam maksimum hatlarının yükseklik olarak çocuğun EditText yüksekliğini ayarlamaktır

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

} (max_lines * font_height). Böylece, iç kaydırma kapalı olacak ve tek kaydırma ana kaydırma olacaktır.

0

Shilkin'in kodu harika çalışıyor. Bunu biraz daha güçlendiriyorum.Şimdi EditText'in doğrudan ebeveynsinin ScrollView olmadığı durumu ele alalım (örneğin, EditText, scrollview'e koymadan önce LinearLayout'a sarılır).

yöntemi kodu: Böyle

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

Çağrı it:

handleEditTextScrollable(comment, R.id.wo_task_comments);