如何在辅助工具栏

时间:2015-09-11 16:28:14

标签: android toolbar searchview

我正在尝试在底部(辅助)android.support.v7.widget.ToolBar中设置一个简单的android.support.v7.widget.SearchView几个小时。 我已经使用另一个工具栏作为ActionBar设置了最顶层,因此我无法在活动中使用onCreateOptionsMenu回调,而是必须设置OnMenuItemClickListener()。我已阅读有关工具栏的the Android SearchView Tutorialthis tutorial

相关代码, 简化的HomepageActivity

package something.somethingelse.activities;

import android.app.ProgressDialog;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.OnCloseListener;
import android.support.v7.widget.SearchView.OnQueryTextListener;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;


public class HomepageActivity extends AppCompatActivity {

protected static final String TAG = "HomepageActivity";
private Toolbar mTopToolbar;
private Toolbar mBottomToolbar;
private FloatingActionButton mFab;
private Context mContext;

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mTopToolbar = (Toolbar) findViewById(R.id.topToolbar);
    setSupportActionBar(mTopToolbar);


    mBottomToolbar = (Toolbar) findViewById(R.id.bottomToolbar);

    mBottomToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {

        @Override
        public boolean onMenuItemClick(MenuItem menuItem) {

            SearchManager searchManager = (SearchManager) HomepageActivity.this.getSystemService(Context.SEARCH_SERVICE);
            SearchView searchView = null;

            if (menuItem != null) {
                Log.d(TAG, "menuItem != null");
                searchView = (SearchView) menuItem.getActionView();
            }

            if (searchView != null) {
                Log.d(TAG, "searchView != null");
                searchView.setSearchableInfo(searchManager.getSearchableInfo(HomepageActivity.this.getComponentName()));
            }

            searchView.setOnCloseListener(new OnCloseListener() {

                @Override
                public boolean onClose() {
                    mBottomToolbar.setVisibility(View.GONE);
                    return false;
                }
            });

            searchView.setOnQueryTextListener(new OnQueryTextListener() {

                @Override
                public boolean onQueryTextSubmit(String arg0) {
                    Log.d(TAG, "Submited: "+arg0);
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String arg0) {
                    Log.d(TAG, "Changed: "+arg0);
                    return false;
                }
            });
            return false;
        }
    });

    mBottomToolbar.inflateMenu(R.menu.bottom_toolbar);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.action_bar, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items

    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

}

简化主页布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:guide="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<android.support.v7.widget.Toolbar
    android:id="@+id/topToolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:background="@color/white"
    guide:elevation="4dp"
    android:minHeight="?attr/actionBarSize"
    guide:theme="@style/Toolbar_Theme" >

    <ImageView
        android:id="@+id/ivAb_logo"
        android:layout_width="wrap_content"
        android:layout_height="?attr/actionBarSize"
        android:paddingBottom="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="58dp"
        android:paddingTop="10dp"
        android:src="@drawable/generic_logo" />
</android.support.v7.widget.Toolbar>

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/topToolbar" >

    <RelativeLayout
        android:id="@+id/homepage_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/homepage_background"
        android:orientation="vertical" >

        <android.support.v7.widget.Toolbar
            android:id="@+id/bottomToolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:background="@color/primaryDark"
            guide:elevation="4dp" />


    </RelativeLayout>

    <!-- The navigation drawer -->

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="220dp"
        android:layout_height="fill_parent"
        android:layout_gravity="start"
        android:background="#60BBBBBB"
        android:choiceMode="singleChoice"
        android:divider="#FFFFFF"
        android:dividerHeight="1px" />
</android.support.v4.widget.DrawerLayout>

menu bottom_toolbar.xml

<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:guide="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/action_search"
    android:title="@string/search"
    android:icon="@drawable/ic_search_white"
    guide:actionViewClass="android.support.v7.widget.SearchView"
    guide:showAsAction="always">
 </item>

searchable.xml

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:hint="@string/search"
android:label="@string/app_name" 
/>

AndroidManifest.xml相关部分

<activity
        android:name="something.somethingelse.activities.HomepageActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.Default" >
        <intent-filter>
            <action     android:name="something.somethingelse.activities.HomepageActivity" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />
        </intent-filter>

        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable" />
    </activity>

如果我这样运行,我会得到一个SearchView但没有我的android:icon="@drawable/ic_search_white",而是我得到谷歌SearchView图标,如果我点击它我得到一个很好的编辑文本,具有清晰和搜索功能,但没有无论我输入什么或按下什么,Toolbar.OnMenuItemClickListener内的Log.d都没有被激发。 (由于声誉,我无法发布图片)。 如果我使用android:actionViewClass="android.support.v7.widget.SearchView"代替guide:actionViewClass="android.support.v7.widget.SearchView",我会获得android:icon="@drawable/ic_search_white",如果我点按它,我会在searchView.setOnCloseListener(new OnCloseListener() {上获得NPE,因为searchView为空。

我尝试在this相关问题上做了什么,this但到目前为止没有成功。

1 个答案:

答案 0 :(得分:1)

2015年9月23日更新 我找不到任何好的解决方案,所以,因为我只想获得SearchView项目,所以我决定像这样攻击它:

setOnMenuItemClickListener()

本质上,我只是查看工具栏,并获取其中唯一的项目,我将其转换为MenuItem,然后我将SearchView作为MenuItem的ActionView。 就像它工作,我不必使用mSearchView.OnQueryTextListener。当我点击视图时,我可以输入它(我不需要onNewIntent()但是,我已经看到它工作了),当我按下键盘上的放大镜时我得到了drawingManager = new google.maps.drawing.DrawingManager({ drawingMode: null, drawingControlOptions: { drawingModes: [google.maps.drawing.OverlayType.CIRCLE, google.maps.drawing.OverlayType.RECTANGLE] }, rectangleOptions: shapeOptions, circleOptions: shapeOptions, Options: shapeOptions, map: map }); 电话工作