我想在我知道的文本的某些部分滚动我的TextView,并将其显示在顶部。这是我的scrollView和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);
}
});
}
这不起作用,为什么?谢谢!
答案 0 :(得分:0)
好的,代码很好。它滚动到“scrollView”的当前(x,y)位置,如下所示: http://developer.android.com/reference/android/widget/ScrollView.html#scrollTo(int,int)
所以我觉得这是一个解释上的麻烦。与文本视图上的“行”不同,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
正如我在评论中所说,首先得到一个包含每一行的向量,然后查找该单词。最后使用前面的代码移动到当前行。
答案 1 :(得分: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](对于exsampe ..)我知道正确的高度。我现在的问题是删除TextView之间的空间..但它的工作原理!