2012-03-19 18 views
7

के अंदर स्क्रॉलिंग EditText मुझे एक बुरा समस्या है। मेरे पास ScrollView के अंदर EditText (8 लाइनें) हैं। और जब मैं EditText में टेक्स्ट स्क्रॉल करने का प्रयास कर रहा हूं तो इसका व्यवहार स्थिर नहीं है। कभी-कभी यह स्क्रॉलिंग होता है, कुछ बार यह ध्यान नहीं ले रहा है।ScrollView

यह मेरा लेआउट फाइल है, मेरे सवाल का और अधिक स्पष्ट बनाने के लिए:

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

मैं समझता हूँ कि मैं क्योंकि एक के अंदर एक स्क्रॉल नियंत्रण रखने का यह समस्या आ रही है, अभी तक मुझे नहीं पता कि इसके साथ क्या करना है। तो, अगर आप कर सकते हैं तो कृपया मेरी मदद करें।

अग्रिम धन्यवाद।

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

मैंने यह कोशिश की है, और नतीजा नहीं है। मैं अभी भी अपने संपादन बॉक्स को स्क्रॉल करने में असमर्थ हूं।

उत्तर

28

प्रयास करें:

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

आपके मामले में:

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

सिर्फ एक ही उत्तर पोस्ट, एक अतिरिक्त के रूप में आप शायद अन्य स्क्रॉल otherviews.setOnTouchListener अक्षम करना पड़ था (नई ऑन टच लिस्टनर() { \t \t \t सार्वजनिक बूलियन ऑन टच (देखें वी, मोशनवेवेंट इवेंट) { \t \t \t \t वापस लौटें; \t \t \t} \t \t}); प्रतिक्रिया के लिए – Ceetn

+0

धन्यवाद। इस पल के लिए मैं अभी भी अपनी समस्या को ठीक करने में असमर्थ हूं। – Orest

+0

मैंने अपना प्रश्न अपडेट कर लिया है। – Orest

-1

एक विकल्प की कुल अधिकतम लाइनों की ऊंचाई के रूप में बच्चे EditText की ऊंचाई निर्धारित करने के लिए है (max_lines * font_height)। इसलिए, आंतरिक स्क्रॉल बंद हो जाएगा और एकमात्र स्क्रॉल मूल स्क्रॉल होगी।

0

शिल्किन का कोड बहुत अच्छा काम करता है। मैं इसे थोड़ा और मजबूत बना देता हूं.अब यह स्थिति को संभालता है कि एडिटटेक्स्ट का सीधा पैरेंट स्क्रॉलव्यू नहीं है (उदाहरण के लिए, स्क्रॉलव्यू में डालने से पहले एडिटटेक्स्ट लिनियरलाइट में लपेटा गया है)।

विधि कोड:

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

इसे इस तरह कॉल:

handleEditTextScrollable(comment, R.id.wo_task_comments); 
संबंधित मुद्दे