2010-07-19 95 views
0

我試圖使放置在ScrollView中的不可編輯EditText以編程方式控制滾動(當檢測到左/右方向跳動時)。以編程方式在ScrollView上滾動EditText

好吧,這裏是我的簡單的佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <ScrollView 
     android:id="@+id/sv" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     > 
     <EditText android:id="@+id/maintext" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:longClickable="false" 
      android:selectAllOnFocus="false" 
      android:focusable="false" 
      android:editable="false"/> 
    </ScrollView> 
</LinearLayout> 

這裏是我的簡單的程序:

package com.test.testscroll; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.widget.EditText; 
import android.widget.ScrollView; 
import android.widget.Toast; 

public class TestScroll extends Activity { 
    private EditText mMainText; 
    private ScrollView mScrollView; 
    private GestureDetector gestureDetector; 
    View.OnTouchListener gestureListener; 
    private GestureDetector scrollGestureDetector; 
    View.OnTouchListener scrollGestureListener; 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

    private final String testString = "This is a very long line for testing purpose. Line number 1" + 
    "This is a very long line for testing purpose. Line number 2" + 
    "This is a very long line for testing purpose. Line number 3" + 
    "This is a very long line for testing purpose. Line number 4" + 
    "This is a very long line for testing purpose. Line number 5" + 
    "This is a very long line for testing purpose. Line number 6" + 
    "This is a very long line for testing purpose. Line number 7" + 
    "This is a very long line for testing purpose. Line number 8" + 
    "This is a very long line for testing purpose. Line number 9" + 
    "This is a very long line for testing purpose. Line number 10" + 
    "This is a very long line for testing purpose. Line number 11" + 
    "This is a very long line for testing purpose. Line number 12" + 
    "This is a very long line for testing purpose. Line number 13" + 
    "This is a very long line for testing purpose. Line number 14" + 
    "This is a very long line for testing purpose. Line number 15" + 
    "This is a very long line for testing purpose. Line number 16" + 
    "This is a very long line for testing purpose. Line number 17" + 
    "This is a very long line for testing purpose. Line number 18" + 
    "This is a very long line for testing purpose. Line number 19" + 
    "This is a very long line for testing purpose. Line number 20" + 
    "This is a very long line for testing purpose. Line number 21" + 
    "This is a very long line for testing purpose. Line number 22" + 
    "This is a very long line for testing purpose. Line number 23" + 
    "This is a very long line for testing purpose. Line number 24" + 
    "This is a very long line for testing purpose. Line number 25" + 
    "This is a very long line for testing purpose. Line number 26" + 
    "This is a very long line for testing purpose. Line number 27" + 
    "This is a very long line for testing purpose. Line number 28" + 
    "This is a very long line for testing purpose. Line number 29" + 
    "This is a very long line for testing purpose. Line number 30" + 
    "This is a very long line for testing purpose. Line number 31" + 
    "This is a very long line for testing purpose. Line number 32" + 
    "This is a very long line for testing purpose. Line number 33" + 
    "This is a very long line for testing purpose. Line number 34" + 
    "This is a very long line for testing purpose. Line number 35" + 
    "This is a very long line for testing purpose. Line number 36" + 
    "This is a very long line for testing purpose. Line number 37" + 
    "This is a very long line for testing purpose. Line number 38" + 
    "This is a very long line for testing purpose. Line number 39" + 
    "This is a very long line for testing purpose. Line number 40" + 
    "This is a very long line for testing purpose. Line number 41" + 
    "This is a very long line for testing purpose. Line number 42" + 
    "This is a very long line for testing purpose. Line number 43" + 
    "This is a very long line for testing purpose. Line number 44" + 
    "This is a very long line for testing purpose. Line number 45" + 
    "This is a very long line for testing purpose. Line number 46" + 
    "This is a very long line for testing purpose. Line number 47" + 
    "This is a very long line for testing purpose. Line number 48" + 
    "This is a very long line for testing purpose. Line number 49" + 
    "This is a very long line for testing purpose. Line number 50"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mMainText = (EditText) findViewById(R.id.maintext); 
     mScrollView = (ScrollView) findViewById(R.id.sv); 
     mMainText.setText(testString); 

    // Gesture detection 
     gestureDetector = new GestureDetector(new MyGestureDetector()); 
     gestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      } 
     }; 

     mMainText.setOnTouchListener(gestureListener); 

     scrollGestureDetector = new GestureDetector(new ScrollGestureDetector()); 
     scrollGestureListener = new View.OnTouchListener() { 
      public boolean onTouch(View v, MotionEvent event) { 
       if (scrollGestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      } 
     }; 

     mScrollView.setOnTouchListener(scrollGestureListener); 
    } 

    class MyGestureDetector extends SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      try { 
       if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
        return false; 
       // right to left swipe 
       if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        Toast.makeText(TestScroll.this, "Left Swipe", Toast.LENGTH_SHORT).show(); 
        mScrollView.pageScroll(ScrollView.FOCUS_UP); 
        return true; 
       } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        Toast.makeText(TestScroll.this, "Right Swipe", Toast.LENGTH_SHORT).show(); 
        mScrollView.pageScroll(ScrollView.FOCUS_DOWN); 
        return true; 
       } 
      } catch (Exception e) { 
       // nothing 
      } 
      return false; 
     } 

    } 

    class ScrollGestureDetector extends SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      return true; 
     } 

     @Override 
     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 
     { 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e) 
     { 
      // Do nothing 
     } 

    } 
} 

所以,簡單地解釋它,我有我連接到兩個自定義simplegesture類EditText和ScrollView。對於EditText,我試圖檢測到左/右投擲,當檢測到時,我將它向上/向下滾動1頁。附加到ScrollView的自定義簡單程序是禁用手指滾動。

這裏的截屏的右側一扔做後: ​​

我有點兒工作,但現在我有兩個問題:

  1. 如何控制滾動,使線不會得到「切斷」(請參考上圖,屏幕上的第一行有點「切斷」)。
  2. 爲什麼當我以編程方式向上/向下滾動頁面時,EditText是自動選擇全部(請參考上圖,滾動後整個屏幕變成橙色)?
  3. 爲什麼當我改變MyGestureDetector來檢測Y軸上的投影(垂直投影)並以編程方式滾動EditText時,它不起作用?即使我也在ScrollGestureDetector中進行了更改,它也不起作用。它與ScrollView的行爲有關嗎?

謝謝!

回答

1

「3.編程滾動的EditText,它不」工作」

發表一個Runnable帶滾動碼滾動型,而不是直接調用滾動的方法。

柱(可運行動作)

導致要被添加到消息隊列中的可運行。可運行的程序將在 用戶界面線程上運行。

來自:ScrollView and programmatically scrolling

蘭斯Nanek

有過去的這個你可以 挖線程。基本上你必須讓 ScrollView有機會認識到它有 有東西添加到它。例如:
scroll.post(new Runnable(){
public void run(){
scroll.fullScroll(ScrollView。FOCUS_DOWN); }});

0

添加以下行到XML的EditText控制,

android:scrollbars="vertical" android:fadeScrollbars="false" 

,然後添加這個優先權人編碼

"EditText Control Object".setMovementMethod(new ScrollingMovementMethod()); 
0

較晚,但可能有助於有人這個問題.. 這需要大約200毫秒添加最後一個元素並更新它爲scrollView,所以這一定會起作用。

void scrollDown() 
{ 
    Thread scrollThread = new Thread(){ 
     public void run(){ 
      try { 
       sleep(200); 
       ChatActivity.this.runOnUiThread(new Runnable() { 
        public void run() { 
         myScrollView.fullScroll(View.FOCUS_DOWN); 
        }  
       }); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    scrollThread.start(); 
} 

在向scrollView添加元素後,請致電scrollDown();