从DialogFragment返回后SearchView查询内容重置问题求助
解决DialogFragment关闭后SearchView查询内容被重置的问题
问题原因
- 错误的SearchView获取方式:你在
onDialogPositiveClick中用findViewById(R.id.acc_buscar)获取SearchView,但SearchView是MenuItem的ActionView,并非直接嵌入Activity布局的控件,这种方式无法获取到当前显示的SearchView实例,后续操作会触发异常。 - 未保存查询状态:DialogFragment关闭时,ActionBar可能因焦点变化或重绘触发
onCreateOptionsMenu重新执行,而每次初始化SearchView时都没有恢复之前的查询文本,导致内容被重置。
解决方案
1. 保存SearchView实例与查询文本
将SearchView和当前查询文本设为Activity成员变量,避免每次临时获取:
public class BusquedaActivity extends AppCompatActivity implements FiltroTemasDialogFragment.FiltroTemasDialogListener { RecyclerView rv; LinearLayoutManager lm; RecursoAdapter ra; private SearchView mSearchView; private String mCurrentQuery; // 保存当前查询内容 // ... 其他原有代码 }
2. 正确初始化并恢复查询文本
修改onCreateOptionsMenu,初始化SearchView时恢复之前保存的查询内容:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.busqueda, menu); MenuItem searchItem = menu.findItem(R.id.acc_buscar); mSearchView = (SearchView) searchItem.getActionView(); mSearchView.setIconifiedByDefault(false); // 恢复之前的查询内容 if (mCurrentQuery != null && !mCurrentQuery.isEmpty()) { mSearchView.setQuery(mCurrentQuery, false); mSearchView.clearFocus(); // 可选:避免自动弹出软键盘 } mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String cad) { mCurrentQuery = cad; // 保存提交的查询 buscador(cad); return true; } @Override public boolean onQueryTextChange(String cad) { mCurrentQuery = cad; // 实时保存输入的内容 return true; } }); return true; }
3. 正确获取查询内容执行搜索
修改onDialogPositiveClick,直接使用成员变量获取查询内容:
@Override public void onDialogPositiveClick(FiltroTemasDialogFragment dialog) { // ... 你的筛选逻辑 mCurrentQuery = mSearchView.getQuery().toString(); buscador(mCurrentQuery); }
4. 处理配置变化(可选)
如果你的Activity支持屏幕旋转等配置变化,需要保存查询状态避免重建时丢失:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("current_query", mCurrentQuery); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if (savedInstanceState != null) { mCurrentQuery = savedInstanceState.getString("current_query"); } }
内容的提问来源于stack exchange,提问作者Campanita
相关产品推荐
相关产品推荐

