0

我想在我知道的文本的某些部分滚动我的 TextView,并将其显示在顶部。这是我的滚动视图和文本视图:

<ScrollView   
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:scrollbars="vertical"
    android:id="@+id/scroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent">     

    <TextView 
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"/>  
</ScrollView>

我的文本是一个字符串数组:

ScrollView scroll= (ScrollView) getActivity().findViewById(R.id.scroll);
TextView text = (TextView) getActivity().findViewById(R.id.text);
String book ="";
for(String line: lines){
  book += line; 
}
text.setText(book);

这是我想滚动的时候:

String find = book[myindex];
int go = text.indexOf(find);
makeScroll(go);

这是我的可运行文件:

    private void makeScroll(final int go){
        scrollRegole.post(new Runnable() {
            public void run() {
                  scrollRegole.scrollTo(0, go);
            }
        });
    }

这是行不通的,为什么?谢谢!

4

2 回答 2

0

好的,代码很好。它滚动到“scrollView”的当前(x,y)位置,如下所示:http: //developer.android.com/reference/android/widget/ScrollView.html#scrollTo (int , int)

所以我认为这是一个解释问题。textView 上的“线”与 ScrollView 上的“y”坐​​标不同。因此,如果您想获得第 15 行,例如,“go variable”不能为 15,它应该与“TextSize”+ padding + margin 等成比例...

你懂我的意思吗?希望能帮助到你。

编辑:: 这是我尝试过的一个测试,如果你知道哪一行是你想要的,它工作正常。也许问题是你没有正确计算线

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity {

    ScrollView scroll;
    TextView text;
    EditText editText;
    Button but;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text = (TextView) findViewById(R.id.text);
        scroll = (ScrollView) findViewById(R.id.scroll);
        but = (Button) findViewById(R.id.button1);
        editText = (EditText) findViewById(R.id.editText1);

        but.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                int go = Integer.valueOf(editText.getText().toString());
                makeScroll(go);
            }
        });

    }

    private void makeScroll(final int go) {
        scroll.post(new Runnable() {
            public void run() {
                scroll.scrollTo(0, go * text.getLineHeight());
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

和xml

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:onClick="handleClick"
        android:orientation="vertical"
        tools:context=".PlayActivity" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Button" />

            <EditText
                android:id="@+id/editText1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:ems="10"
                android:inputType="number" />

        </LinearLayout>

        <ScrollView
            android:id="@+id/scroll"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="vertical" >

            <TextView
                android:id="@+id/text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="16dp"
                android:text="sdqwerhdf adf qwer hdfashdf aE HFASDJFH ASKDFH QWLIULER HASDLIDLF HASDKJFH SDJF HAWEUJRH AS DKJFHL AWIUE4R YAS DJHFWIERUHF AUDF JHAWHWER ASJDFH ASDFHAS JEHLRUAIKYHE KURF ASJKDFHJ ASDFKJAHSDF ASDFASDF ASDF ASDFASDFASDF QWETR DGFsdqwerhdf adf qwer hdfashdf aE HFASDJFH ASKDFH QWLIULER HASDLIDLF HASDKJFH SDJF HAWEUJRH AS DKJFHL AWIUE4R YAS DJHFWIERUHF AUDF JHAWHWER ASJDFH ASDFHAS JEHLRUAIKYHE KURF ASJKDFHJ ASDFKJAHSDF ASDFASDF ASDF ASDFASDFASDF QWETR DGF"
                android:textSize="20dp" />

        </ScrollView>

    </LinearLayout>

编辑:: 编辑:

为了得到这条线,这是一个可能的解决方案: Android TextView and getting line of text

正如我在评论中所说,首先获取一个包含每一行的向量,然后查找单词。最后使用前面的代码移动到当前行。

于 2013-09-09T23:32:04.730 回答
0

这就是我解决问题的方法:这是我的新 ScrollView:

    <ScrollView 
        android:id="@+id/scroll"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        android:layout_weight="3" >

        <LinearLayout
            android:id="@+id/containerTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>      
    </ScrollView>

在这里,我将许多 TextView 添加到我的容器中:

if(scroll == null){
   scroll = (ScrollView) getActivity().findViewById(R.id.scroll);
}

if(layout == null)
       layout = (LinearLayout) getActivity().findViewById(R.id.containerTextView);

layout.removeAllViews();

for(String line: lines){
   TextView text = new TextView(getActivity());
   text.setText(line);  
   text.setTextSize(...));          
   layout.addView(text);
}

这是我想滚动的时候:

private void calculateScroll(final LinearLayout layout, final int indexLine){

    layout.addOnLayoutChangeListener(new OnLayoutChangeListener(){

        @Override
        public void onLayoutChange(View paramView, int paramInt1,
                int paramInt2, int paramInt3, int paramInt4, int paramInt5,
                int paramInt6, int paramInt7, int paramInt8) {

            int y = 0;
            for(int x=0; x< indexLine; x++){    
                y += layout.getChildAt(x).getHeight();
            }

            makeScroll(y);
        }

    });
}

private void makeScroll(final int go){
    scrollRegole.post(new Runnable() {
        public void run() {
            scroll.scrollTo(0, go);
        }
    });
}

在这里,如果我想显示行 [3](例如 ..),我知道正确的高度。我现在的问题是删除 TextView 之间的空间.. 但它有效!

于 2013-09-11T12:00:14.080 回答