我已经使用了MaterialSearchView库,关键是我在使用此库之前在此Activity中使用了导航抽屉,所以我不得不使用两层菜单XML。 我不知道它是否正确。我已经对以前的代码进行了采样:
这适用于导航抽屉菜单项目:
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_SellPaper"
android:icon="@drawable/ic_seller"
android:title="@string/SellMyPaper" />
<item
android:id="@+id/nav_sendPaper"
android:icon="@drawable/ic_input_black_24dp"
android:title="@string/SendPaperMenu" />
<item
android:id="@+id/nav_MyDownloads"
android:icon="@drawable/ic_lib"
android:title="@string/MyLibMenu" />
<item
android:id="@+id/nav_fav"
android:icon="@drawable/ic_favorite"
android:title="@string/MyFav" />
<item
android:id="@+id/nav_manage"
android:icon="@drawable/ic_account_box_black_24dp"
android:title="@string/UserAccMenu" />
<item
android:id="@+id/nav_share"
android:icon="@drawable/ic_share_black"
android:title="@string/ShareMenu" />
<item
android:id="@+id/nav_slideshow"
android:icon="@drawable/ic_slideshow"
android:title="@string/LearningMenu" />
<item
android:id="@+id/nav_logout"
android:icon="@drawable/ic_exit_to_app"
android:title="@string/LogoutMenu" />
</group>
<item android:title="@string/ConnectUsMenu">
<menu>
<item
android:id="@+id/send_tel"
android:icon="@drawable/ic_send_black_24dp"
android:title="@string/TelegramMe" />
<item
android:id="@+id/send_mail"
android:icon="@drawable/ic_email_black_24dp"
android:title="@string/EmailME" />
</menu>
</item>
这适用于搜索菜单项目:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
android:icon="@drawable/ic_action_action_search"
android:orderInCategory="100"
android:title="@string/abc_search_hint"
app:showAsAction="always" />
在 Appbar布局中,我使用了以下代码:
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
app:titleTextColor="@color/TextView"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<com.miguelcatalan.materialsearchview.MaterialSearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_menu" />
我的活动java代码包含以下内容:
public class MenuActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, AdapterView.OnItemSelectedListener, View.OnClickListener, MaterialSearchView.OnQueryTextListener, MaterialSearchView.SearchViewListener {
MaterialSearchView searchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
searchView = findViewById(R.id.search_view);
searchView.setVisibility(GONE);
searchView.setOnQueryTextListener(this);
searchView.setOnSearchViewListener(this);
...
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest stringRequest = new StringRequest(Request.Method.GET, SearchURL, new Listener<String>() {
@Override
public void onResponse(String response) {
try {
//this is my output array
ArrayList<String> arrayList = new ArrayList<>();
//lvl1
JSONArray jsonarray = new JSONArray(response);
for (int i = 0; i < jsonarray.length(); i++) {
JSONObject jsonobject = jsonarray.getJSONObject(i);
//lvl2
JSONArray catArray = jsonobject.getJSONArray("Category");
for(int j = 0; j < catArray.length(); j++){
//lvl3
if(!arrayList.contains(catArray.getString(j)) && !catArray.isNull(j) ){
arrayList.add(catArray.getString(j));
}
}
}
SharedPreferences prefs=PreferenceManager.
getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor edit=prefs.edit();
Set<String> set = new HashSet<String>(arrayList);
edit.putStringSet("CAT", set);
edit.apply();
} catch (Exception e) {
e.printStackTrace();
}
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
int socketTimeout = 30000;
RetryPolicy policy = new DefaultRetryPolicy(socketTimeout,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
stringRequest.setRetryPolicy(policy);
requestQueue.add(stringRequest);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
....
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_Sell) {
.........
}
DrawerLayout drawer = findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_search, menu);
MenuItem item = menu.findItem(R.id.action_search);
searchView.setMenuItem(item);
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MaterialSearchView.REQUEST_VOICE && resultCode == RESULT_OK) {
ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
if (matches != null && matches.size() > 0) {
String searchWrd = matches.get(0);
if (!TextUtils.isEmpty(searchWrd)) {
searchView.setQuery(searchWrd, false);
}
}
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
@Override
public void onSearchViewShown() {
searchView.setVisibility(View.VISIBLE);
SharedPreferences prefs = PreferenceManager.
getDefaultSharedPreferences(getApplicationContext());
Set<String> set = prefs.getStringSet("CAT", null);
List<String> sample = null;
String[] values = new String[0];
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
sample = new ArrayList<String>(Objects.requireNonNull(set));
values = new String[Objects.requireNonNull(sample).size()];
for (int i = 0; i < sample.size(); i++) {
values[i] = sample.get(i);
}
}
searchView.setSuggestions( getResources().getStringArray(R.array.query_suggestions) );
}
@Override
public void onSearchViewClosed() {
searchView.setVisibility(View.GONE);
}
使用此方法后,我遇到了问题,对我的搜索建议数量不超过一个,我希望看到更多建议。
下图显示我有3条建议,但我只能看到一条建议:
我看到的内容:
我想看到的内容:
请指导我,谢谢你...
答案 0 :(得分:0)
我建议您将高度设置为android:layout_height="?attr/actionBarSize"
。这就是我几乎在所有场景中所做的事情。
答案 1 :(得分:0)
问题实际上是由于MaterialSearchView是Coordinator Layout中的子项而导致的建议列表未完全显示,可能是MaterialSearchView的错误。 是的,将协调器布局替换为其他任何布局都可以解决此问题。
但是,如果要保留“协调器布局”,则可以使用“相对布局”作为根布局,并在“协调者”布局为第一个子项的情况下将MaterialSearchView添加为“相对”布局中的最后一个子项。这应该使建议列表可滚动,这将使建议列表按照here的说明完全显示。
请参见以下示例:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:fitsSystemWindows="true"
android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="false"
android:theme="@style/ThemeOverlay.AppCompat.ActionBar">
<-your rest of the code->
</android.support.design.widget.CoordinatorLayout>
<com.miguelcatalan.materialsearchview.MaterialSearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:layout_collapseMode="pin"
app:searchSuggestionIcon="@drawable/ic_history_grey_600_24dp" />
</RelativeLayout>