hortizontal滚动型的Android的设置位置(Android setting positi

2019-06-24 07:09发布

我想设置水平滚动型的位置,将其与被压入按钮对应。 我用这个来设定失败它试图:

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个按钮被按下(这是屏幕外)时启动新的活动我想设置新的视图,以便水平滚动型是一路向右与起步一路向左。

如何设置水平滚动型的位置?

Answer 1:

现在你正试图滚动到Horizo​​ntalScrollView的左上角,而不是按钮的位置。 尝试滚动到这样的按钮的(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);
}

然而,这种功能被称为每次活动获得或失去焦点的时间,所以你可能最终往往比你预期的更新滚动位置。

一个更优雅的解决办法是子类Horizo​​ntalScrollView并设置滚动条的位置onMeasure()你知道后,该观点已被初始化。 要做到这一点,我拆你的布局分为两个文件,并添加一个新的命名MyHorizo​​ntalScrollView类:

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

当创建MyHorizo​​ntalScrollView,它会自动膨胀,并增加了按键布局。 然后调用超之后onMeasure()以便它知道布局完成初始化),它设置滚动位置。

这是新的main.xml。 它仅包含新MyHorizo​​ntalScrollView,尽管你可以很容易地把它的线性或相对布局内并添加其他视图元素。 (您将取代com.theisenp.test与在MyHorizo​​ntalScrollView所在的包的名称):

<?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" />

这是由MyHorizo​​ntalScrollView自动充气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>


Answer 2:

虽然,这是一个老问题,最近我碰到了同样的问题,发现另一个而是更简单的解决方案。

让我们假设在原来的问题给出布局文件,让我们假设,如果活动开始与定布局,水平滚动视图需要滚动以按钮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);
            }
        });
    }
}


文章来源: Android setting position of hortizontal scrollview