Android установка положения горизонтального прокрутки
Я пытаюсь установить положение горизонтальной прокрутки, чтобы она соответствовала нажатой кнопке. Я попытался использовать это, чтобы установить его безуспешно:
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-я кнопка нажата (которая находится за кадром), когда начинается новое действие, я хочу установить новый вид, чтобы горизонтальный вид прокрутки был полностью вправо, а не начинался полностью слева.
Как я могу установить положение горизонтальной прокрутки?
2 ответа
Прямо сейчас вы пытаетесь прокрутить в верхний левый угол 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()
после того, как вы знаете, что представление было инициализировано. Для этого я разделил ваш макет на два файла и добавил новый класс с именем MyHorizontScrollView:
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());
}
}
Когда MyHorizontScrollView создан, он автоматически надувается и добавляет макет кнопки. Потом после звонка супер onMeasure()
(чтобы он знал, что макет закончил инициализацию) он устанавливает позицию прокрутки.
Это новый main.xml. Он содержит только новый MyHor horizontalScrollView, хотя вы можете легко разместить его внутри линейного или относительного макета и добавить другие элементы представления. (Вы бы заменили com.theisenp.test
с именем пакета, в котором находится MyHorizontScrollView):
<?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" />
И это макет button.xml, который автоматически раздувается MyHor horizontalScrollView:
<?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);
}
});
}
}