【问题标题】:Two SearchViews in one Activity and screen rotation一个 Activity 中的两个 SearchViews 和屏幕旋转
【发布时间】:2013-02-22 13:01:35
【问题描述】:

我在一个 xml 布局中有两个 SearchView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

    <SearchView
        android:id="@+id/my_first_custom_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </SearchView>

   <SearchView
        android:id="@+id/my_second_custom_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/my_first_custom_view" >
   </SearchView>

</RelativeLayout>

然后我通过 setContentView() 将此布局膨胀到我的 MainActivity。然后我调用方法 setQuery() 为彼此。

在屏幕旋转之前一切正常。 当我旋转屏幕时,每个 searchView 都有文本“World”而不是“Hello”和“World”。

 public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SearchView firstSearchView = (SearchView)     findViewById(R.id.my_first_custom_view);
        SearchView secondSearchView = (SearchView) findViewById(R.id.my_second_custom_view);

        firstSearchView.setQuery("Hello!", false);
        secondSearchView.setQuery("World", false);
    }
}

有人可以解释发生了什么问题吗?

【问题讨论】:

  • 这是您的搜索视图在 onCreate 中获得的唯一参考吗?我假设没有.. 如果没有,那么您可能想要发布相关代码
  • 我尝试了您的代码,并且与您的行为相同......所以重现问题的所有内容都在帖子中
  • 是的,它是唯一的参考。我不再使用它了。

标签: java android


【解决方案1】:

SearchView 使用通过扩展布局文件生成的视图作为其内容。结果,活动布局中使用的所有SearchViews(如您的情况)都将具有具有相同ID的视图作为内容。当 Android 将尝试保存状态以处理配置更改时,它会看到来自 SearchViewsEditTexts 具有相同的 id,它会为所有它们恢复相同的状态。

处理此问题的最简单方法是使用ActivityonSaveInstanceStateonRestoreInstanceState,如下所示:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // state for the first SearchView
    outState.putString("sv1", firstSearchView.getQuery().toString());
    // state for the second SearchView
    outState.putString("sv2", secondSearchView.getQuery().toString());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // properly set the state to balance Android's own restore mechanism
    firstSearchView.setQuery(savedInstanceState.getString("sv1"), false);
    secondSearchView.setQuery(savedInstanceState.getString("sv2"), false);
}

也看看这个related question

【讨论】:

  • 谢谢。有用 ;)。在这种情况下非常重要的是在 onRestoreInstanceState() 方法中恢复实例。当我在 onCreate 中执行此操作时,它不起作用。可能来自 onCreate 的值“Hello”和“World”在 onRestore 方法中被覆盖。
【解决方案2】:

缓解此问题的一种方法是捕捉方向事件随您的活动发生的变化,然后在您的两个搜索视图上再次设置查询。

【讨论】:

  • 你能写更多关于这个的东西吗?
  • 它并不太复杂,谷歌如何监听你活动中的方向变化,然后重新配置你的两个搜索视图。
【解决方案3】:

将此添加到您有两个 SearchView 的活动中的清单

 android:configChanges="keyboardHidden|orientation|screenSize"

【讨论】:

  • @loocash1989 检查我的答案并通知我这是否有帮助。
  • 嗯......这不是问题的答案。这是一种解决方法,但有一些缺点。
  • 这对我来说不是很好的解决方案,但我承认它也有效。我在 SearchView 中寻找错误。此外,我的 Activity 应该在屏幕旋转后重新创建,我不想改变它的默认行为。感谢您的回答。我认为这可能对某人有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多