Android设置hortizontal scrollview的位置

我正在尝试设置水平滚动视图的位置,因此它与按下的按钮相对应。 我尝试使用它来设置它失败:

HorizontalScrollView hsv = (HorizontalScrollView)findViewById(R.id.ScrollView); int x, y; x = hsv.getLeft(); y = hsv.getTop(); hsv.scrollTo(x, y); 

这没有任何结果,滚动视图不受影响。 xml:

    

因此,如果在启动新活动时按下第5个按钮(在屏幕外),我想设置新视图,使水平滚动视图一直向右,而不是一直向左开始。

如何设置水平滚动视图的位置?

  • 检查地理位置是否已被欺骗
  • Android:检查是否使用融合位置提供程序启用了位置服务
  • 如何模拟在真实设备中驾驶路线
  • 获取用户当前位置周围的地点列表
  • 位置getAccuracy()这个函数做什么?
  • Android - 在api 8中使用view.setX()和setY
  • 在Android模拟器中激活网络位置提供程序?
  • 在扩展/缩小或在android中拖动后获取canvas坐标
  • 现在您正在尝试滚动到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 。 在布局完全初始化之前尝试设置滚动位置无效,因此您需要在onCreate()之后的某个时间调用hsv.scrollTo() onCreate()

    似乎onWindowFocusChanged()一个选项是将代码放在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时,它会自动膨胀并添加按钮布局。 然后在调用super onMeasure() (以便它知道布局已经完成初始化),它设置了滚动位置。

    这是新的main.xml。 它只包含新的MyHorizo​​ntalScrollView,但您可以轻松地将其放在Linear或Relative布局中并添加其他视图元素。 (您可以将com.theisenp.test替换为com.theisenp.test所在的包的名称):

     < ?xml version="1.0" encoding="utf-8"?>  

    这是由MyHorizo​​ntalScrollView自动膨胀的buttons.xml布局:

     < ?xml version="1.0" encoding="utf-8"?>         

    虽然,这是一个老问题,但我最近遇到了同样的问题,发现了另一个但不太复杂的解决方案。

    让我们假设原始问题中的给定布局文件,并假设如果使用给定布局启动活动,则需要将水平滚动视图滚动到按钮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); } }); } }