我想设置水平滚动型的位置,将其与被压入按钮对应。 我用这个来设定失败它试图:
HorizontalScrollView hsv = (HorizontalScrollView)findViewById(R.id.ScrollView);
int x, y;
x = hsv.getLeft();
y = hsv.getTop();
hsv.scrollTo(x, y);
这会导致什么,滚动视图不受影响。 该XML:
<HorizontalScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ScrollView"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:background="@null"
android:scrollbars="none" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<Button
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:text="btn0"
android:id="@+id/btn0"
android:background="@drawable/yellow_btn" />
<Button
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:background="@drawable/yellow_btn"
android:text="bnt1"
android:id="@+id/btn1" />
<Button
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:background="@drawable/yellow_btn"
android:text="btn2"
android:id="@+id/btn2" />
<Button
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:background="@drawable/yellow_btn"
android:text="btn3"
android:id="@+id/btn3" />
<Button
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:background="@drawable/yellow_btn"
android:text="btn4"
android:id="@+id/btn4" />
<Button
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:background="@drawable/yellow_btn"
android:text="btn5"
android:id="@+id/btn5" />
</LinearLayout>
</HorizontalScrollView>
所以,如果第5个按钮被按下(这是屏幕外)时启动新的活动我想设置新的视图,以便水平滚动型是一路向右与起步一路向左。
如何设置水平滚动型的位置?
现在你正试图滚动到HorizontalScrollView的左上角,而不是按钮的位置。 尝试滚动到这样的按钮的(X,Y)位置:
HorizontalScrollView hsv = (HorizontalScrollView) findViewById(R.id.ScrollView);
Button button = (Button) findViewById(R.id.btn5);
int x, y;
x = button.getLeft();
y = button.getTop();
hsv.scrollTo(x, y);
编辑:
此代码将不会表现得好像它被放置在你所期望onCreate()
即使你已经调用setContentView()
布局没有进行测定,但初始化。 这意味着getLeft()
和getTop()
方法都将返回0 。 尝试设置滚动位置的布局完全初始化没有效果之前,所以你需要调用hsv.scrollTo()
经过一段时间后onCreate()
一种选择,似乎工作是把代码onWindowFocusChanged()
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
HorizontalScrollView hsv = (HorizontalScrollView) findViewById(R.id.ScrollView);
Button button = (Button) findViewById(R.id.btn5);
int x, y;
x = button.getLeft();
y = button.getTop();
hsv.scrollTo(x, y);
}
然而,这种功能被称为每次活动获得或失去焦点的时间,所以你可能最终往往比你预期的更新滚动位置。
一个更优雅的解决办法是子类HorizontalScrollView并设置滚动条的位置onMeasure()
你知道后,该观点已被初始化。 要做到这一点,我拆你的布局分为两个文件,并添加一个新的命名MyHorizontalScrollView类:
package com.theisenp.test;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.HorizontalScrollView;
public class MyHorizontalScrollView extends HorizontalScrollView {
public MyHorizontalScrollView(Context context) {
super(context);
addButtons(context);
}
public MyHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
addButtons(context);
}
/**
* Inflates the layout containing the buttons and adds them to the ScrollView
* @param context
*/
private void addButtons(Context context) {
View buttons = inflate(context, R.layout.buttons, null);
addView(buttons);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//Find button 5 and scroll to its location
View button = findViewById(R.id.btn5);
scrollTo(button.getLeft(), button.getTop());
}
}
当创建MyHorizontalScrollView,它会自动膨胀,并增加了按键布局。 然后调用超之后onMeasure()
以便它知道布局完成初始化),它设置滚动位置。
这是新的main.xml。 它仅包含新MyHorizontalScrollView,尽管你可以很容易地把它的线性或相对布局内并添加其他视图元素。 (您将取代com.theisenp.test
与在MyHorizontalScrollView所在的包的名称):
<?xml version="1.0" encoding="utf-8"?>
<com.theisenp.test.MyHorizontalScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ScrollView"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:background="@null"
android:scrollbars="none" />
这是由MyHorizontalScrollView自动充气buttons.xml布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<Button
android:id="@+id/btn0"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:text="btn0" />
<Button
android:id="@+id/btn1"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:text="bnt1" />
<Button
android:id="@+id/btn2"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:text="btn2" />
<Button
android:id="@+id/btn3"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:text="btn3" />
<Button
android:id="@+id/btn4"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:text="btn4" />
<Button
android:id="@+id/btn5"
android:layout_width="100dp"
android:layout_height="fill_parent"
android:layout_marginBottom="-5dp"
android:text="btn5" />
</LinearLayout>
虽然,这是一个老问题,最近我碰到了同样的问题,发现另一个而是更简单的解决方案。
让我们假设在原来的问题给出布局文件,让我们假设,如果活动开始与定布局,水平滚动视图需要滚动以按钮5。
为了实现滚动按钮5,把下面的代码中onCreate()
的活性的方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Some code such as layout inflation.
final HorizontalScrollView hsv = (HorizontalScrollView) findViewById(R.id.ScrollView);
// Scrolling to button 5.
hsv.post(new Runnable() {
@Override
public void run() {
// Get the button.
View button = findViewById(R.id.btn5);
// Locate the button.
int x, y;
x = button.getLeft();
y = button.getTop();
// Scroll to the button.
hsv.scrollTo(x, y);
}
});
}
}