【问题标题】:suggestion in search view (height)搜索视图中的建议(高度)
【发布时间】:2018-04-15 21:30:02
【问题描述】:

我用过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" />

而我的 Activity 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 条建议,但我只能看到一条建议:

我所看到的:

What I see

我想看到的:

What I want to see

请指导我,谢谢...

【问题讨论】:

    标签: android android-layout listview search-suggestion


    【解决方案1】:

    我建议您将高度设置为android:layout_height="?attr/actionBarSize"。这就是我在几乎所有场景中所做的。

    【讨论】:

    • 感谢您的建议我通过将Coordinator Layout 更改为Linear Layout 解决了这个问题
    【解决方案2】:

    这个问题实际上是由于 MaterialSearchView 是 Coordinator Layout 中的一个子项,并且建议列表没有完全显示,可能是 MaterialSearchView 的一个错误。 是的,用任何其他布局替换协调器布局应该可以解决问题。

    但是,如果您想保留 Coordinator 布局,则可以将相对布局用作根布局,并将 MaterialSearchView 添加为相对布局中的最后一个子布局,而 Coordinator 布局是第一个子布局。这应该使建议列表可滚动,这将使建议列表完全按照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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      相关资源
      最近更新 更多