方向改变时保存scrollview的位置
Save the position of scrollview when the orientation changes
这是我的布局:
我需要在方向改变时保存滚动位置。例如,如果屏幕在纵向模式下显示从中间名开始的布局,那么在横向模式下它应该从中间名开始。
你如果你的activity在轮换时没有改变任何东西你可以使用
android:configChanges="orientation|keyboardHidden|screenSize" 在此特定 activity 的清单文件中。但这显然是解决方法,而不是正确的解决方案。
注:
如果您需要为横向和纵向使用不同的视图,或者如果您需要为不同的设备使用不同的视图,应该使用 bundle 并在 saveinstancestate 中保存数据并在 oncreate 中检索数据。此方法停止重新创建 activity 并且 activity 假定事情将由用户 himself/herself.
处理
在清单中执行此操作..
<activity
android:name=".YourActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name" >
</activity>
要在 phone 方向更改时保存和恢复 ScrollView 的滚动位置,您可以执行以下操作:
在onSaveInstanceState方法中保存当前位置:
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putIntArray("ARTICLE_SCROLL_POSITION",
new int[]{ mScrollView.getScrollX(), mScrollView.getScrollY()});
}
然后在onRestoreInstanceState方法中恢复位置。请注意,我们需要 post 一个 Runnable 到 ScrollView 才能让它工作:
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
final int[] position = savedInstanceState.getIntArray("ARTICLE_SCROLL_POSITION");
if(position != null)
mScrollView.post(new Runnable() {
public void run() {
mScrollView.scrollTo(position[0], position[1]);
}
});
}
在 google 上找到了这个解决方案。感谢 Original Coder。 :)
参考这些以保持滚动位置并在方向更改后滚动。
只需在您的滚动元素上设置 android:id。您的视图将自动保存其滚动位置。
代码来自 View.java:15554
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
if (mID != NO_ID && (mViewFlags & SAVE_DISABLED_MASK) == 0) {
mPrivateFlags &= ~PFLAG_SAVE_STATE_CALLED;
Parcelable state = onSaveInstanceState();
if ((mPrivateFlags & PFLAG_SAVE_STATE_CALLED) == 0) {
throw new IllegalStateException(
"Derived class did not call super.onSaveInstanceState()");
}
if (state != null) {
// Log.i("View", "Freezing #" + Integer.toHexString(mID)
// + ": " + state);
container.put(mID, state);
}
}
}
在我的三星平板电脑上,我不必添加那么多代码(只需调用超类)。另外,我已经在 ListView 上有了名字。
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/search_text"
android:maxLines="1"
android:inputType="text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Enter search string here" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doSearch"
android:clickable="true"
android:text="Search"
android:layout_toRightOf="@id/search_text"/>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_of_books"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/search_text"
android:divider="@null"
android:orientation="vertical" />
</RelativeLayout>
这是我的布局:
我需要在方向改变时保存滚动位置。例如,如果屏幕在纵向模式下显示从中间名开始的布局,那么在横向模式下它应该从中间名开始。
你如果你的activity在轮换时没有改变任何东西你可以使用 android:configChanges="orientation|keyboardHidden|screenSize" 在此特定 activity 的清单文件中。但这显然是解决方法,而不是正确的解决方案。
注:
如果您需要为横向和纵向使用不同的视图,或者如果您需要为不同的设备使用不同的视图,应该使用 bundle 并在 saveinstancestate 中保存数据并在 oncreate 中检索数据。此方法停止重新创建 activity 并且 activity 假定事情将由用户 himself/herself.
处理在清单中执行此操作..
<activity
android:name=".YourActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name" >
</activity>
要在 phone 方向更改时保存和恢复 ScrollView 的滚动位置,您可以执行以下操作: 在onSaveInstanceState方法中保存当前位置:
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putIntArray("ARTICLE_SCROLL_POSITION",
new int[]{ mScrollView.getScrollX(), mScrollView.getScrollY()});
}
然后在onRestoreInstanceState方法中恢复位置。请注意,我们需要 post 一个 Runnable 到 ScrollView 才能让它工作:
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
final int[] position = savedInstanceState.getIntArray("ARTICLE_SCROLL_POSITION");
if(position != null)
mScrollView.post(new Runnable() {
public void run() {
mScrollView.scrollTo(position[0], position[1]);
}
});
}
在 google 上找到了这个解决方案。感谢 Original Coder。 :)
参考这些以保持滚动位置并在方向更改后滚动。
只需在您的滚动元素上设置 android:id。您的视图将自动保存其滚动位置。
代码来自 View.java:15554
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
if (mID != NO_ID && (mViewFlags & SAVE_DISABLED_MASK) == 0) {
mPrivateFlags &= ~PFLAG_SAVE_STATE_CALLED;
Parcelable state = onSaveInstanceState();
if ((mPrivateFlags & PFLAG_SAVE_STATE_CALLED) == 0) {
throw new IllegalStateException(
"Derived class did not call super.onSaveInstanceState()");
}
if (state != null) {
// Log.i("View", "Freezing #" + Integer.toHexString(mID)
// + ": " + state);
container.put(mID, state);
}
}
}
在我的三星平板电脑上,我不必添加那么多代码(只需调用超类)。另外,我已经在 ListView 上有了名字。
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/search_text"
android:maxLines="1"
android:inputType="text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Enter search string here" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="doSearch"
android:clickable="true"
android:text="Search"
android:layout_toRightOf="@id/search_text"/>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_of_books"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/search_text"
android:divider="@null"
android:orientation="vertical" />
</RelativeLayout>