我创建一个小例子来展示我的问题。 使用工具栏中的SearchView和3个按钮的主要布局: 1)设置文本 - 展开搜索视图并设置查询 2)展开 - 展开搜索视图 3)折叠 - 折叠搜索视图
activity_main.xml中
机器人:fitsSystemWindows ="真">
<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>
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();
}
}
}
当我从onCreateOptionsMenu调用方法init()时出现我的问题(在真实的应用程序中我使用来自intent extra的文本初始化SearchView)。如果我从init调用setToolbarSearchQuery方法,然后单击折叠按钮后SearchView折叠并且搜索图标消失。
但是如果我不调用init方法并且将使用set text按钮调用相同的方法setToolbarSearchQuery它可以正常工作(SearchView折叠并且工具栏中显示搜索图标)。
我如何解决这个问题?为什么图标在崩溃后会消失?
我明白当我从onCreateOptionsMenu扩展SearchView时会发生这种情况。但我怎么能从intent extra更正init SearchView?
答案 0 :(得分:0)
我发现只有一个解决方案。在init方法中设置文本延迟。
public void init() {
//setToolbarSearchQuery("Text from intent");
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
toolbarSearchMenuItem.expandActionView();
toolbarSearchView.setQuery("Text from intent", false);
}
}, 1000);
}
但我不喜欢这个解决方案。它看起来像诡计。
答案 1 :(得分:0)
&#34; anton111111&#34;答案效果很好,但对于那些不想使用延迟的人,我建议更改搜索菜单项showAsAction属性如下:
android:showAsAction="always|collapseActionView"
而不是
android:showAsAction="ifRoom|collapseActionView"
请参阅原始答案here。