Ant*_*111 4 android searchview
我创建了一个小例子来展示我的问题。主布局,工具栏中有 SearchView 和 3 个按钮: 1) 设置文本 - 展开搜索视图并设置查询 2) 展开 - 展开搜索视图 3) 折叠 - 折叠搜索视图
Activity_main.xml
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context="com.porn.MainActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="368dp"
android:layout_height="wrap_content"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="0dp">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:contentInsetStartWithNavigation="0dp">
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<Button
android:id="@+id/setTextBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Set text" />
<Button
android:id="@+id/expandBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Expand" />
<Button
android:id="@+id/collapseBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Collapse" />
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
MainActivity.java
public class MainActivity extends AppCompatActivity {
private MenuItem toolbarSearchMenuItem;
private SearchView toolbarSearchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
findViewById(R.id.expandBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toolbarSearchMenuItem.expandActionView();
}
});
findViewById(R.id.collapseBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toolbarSearchMenuItem.collapseActionView();
}
});
findViewById(R.id.setTextBtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setToolbarSearchQuery("Text2");
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toobar, menu);
toolbarSearchMenuItem = menu.findItem(R.id.toolbar_action_search);
toolbarSearchView = (SearchView) menu.findItem(R.id.toolbar_action_search).getActionView();
init();
return true;
}
public void init() {
//In real app i get searchQuery from extra
//String searchQuery = getIntent().getStringExtra(INTENT_EXTRA_SEARCH_QUERY_KEY);
setToolbarSearchQuery("Text from intent");
}
private void setToolbarSearchQuery(String searchQuery) {
if (!searchQuery.equals("")) {
toolbarSearchMenuItem.expandActionView();
toolbarSearchView.setQuery(searchQuery, false);
toolbarSearchView.clearFocus();
} else {
toolbarSearchMenuItem.collapseActionView();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我从 onCreateOptionsMenu 调用方法 init() 时出现我的问题(在实际应用程序中,我使用来自意图额外的文本初始化 SearchView )。如果我从 init 调用 setToolbarSearchQuery 方法,然后单击折叠按钮 SearchView 折叠并且搜索图标消失。
但是,如果我不调用 init 方法,而是使用设置文本按钮调用相同的方法 setToolbarSearchQuery ,则它可以正常工作(SearchView 折叠,搜索图标显示在工具栏中)。
我该如何解决这个问题?为什么崩溃后图标消失了?
我知道当我从 onCreateOptionsMenu 展开 SearchView 时会发生这种情况。但是我如何从额外意图中更正 init SearchView 呢?
小智 6
“anton111111”答案工作得很好,但对于那些不想使用延迟的人来说,我建议更改搜索菜单项 showAsAction 属性,如下所示:
android:showAsAction="always|collapseActionView"
Run Code Online (Sandbox Code Playgroud)
代替
android:showAsAction="ifRoom|collapseActionView"
Run Code Online (Sandbox Code Playgroud)
请参阅此处的原始答案。