搜索界面在搜索android上启动新活动

时间:2016-02-04 20:07:58

标签: android android-sqlite android-search

我正在学习使用搜索栏。用户点击搜索后,它会启动2个新活动,这些新活动不再有搜索栏。它也不会更新UI。如果可能的话,我希望进行搜索并将结果全部发布在同一活动中。我正在使用Genymotion emmulator。

主要活动

div.comment *{
   display:inline-block;
   margin:0 .2rem;
}
div.comment p{
   margin-right:1rem;
}
div.comment img{
   height:25px;
   width: 25px;
}

Android Mainfest

public class MainActivity extends Activity {

protected LibraryDataSource mDataSource;
protected ArrayList<String> mBookTitles;
protected ArrayList<Integer> mBookPages;

private EditText mEditText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mDataSource = new LibraryDataSource(MainActivity.this);
    mBookTitles = new ArrayList<>();
    mBookPages = new ArrayList<>();

    Book book1 = new Book("Harry potter", 15);
    Book book2 = new Book("Far Cry", 25);
    Book book3 = new Book("Jumpman", 35);

    List<Book> books = new ArrayList<>();
    books.add(book1);
    books.add(book2);
    books.add(book3);

    mDataSource.open();
    mDataSource.deleteAll();
    mDataSource.insertBook(books);

    mEditText = (EditText) findViewById(R.id.title_type);

}

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager =
        (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView =
        (SearchView) menu.findItem(R.id.search).getActionView();
    searchView.setSearchableInfo(
        searchManager.getSearchableInfo(MainActivity.this.getComponentName()));

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.search) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

SearchBookActivity

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
    <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            >
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>

        <meta-data
                android:name="android.app.default_searchable"
                android:value=".SearchBookActivity" />

    </activity>

    <activity android:name=".SearchBookActivity">
        <intent-filter>
            <action android:name="android.intent.action.SEARCH" />

        </intent-filter>

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

</application>

1 个答案:

答案 0 :(得分:1)

我会在我希望集中搜索功能的同一活动中同时使用两个<meta-data>标记。虽然您可以拥有多个支持搜索的活动。 Material Design应用程序显示,只有一个搜索UI,片段或活动,是更有效的应用程序生产实践。

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

每日案例是搜索数据集合中的数据集合。网格,列表等

每次启动Intent with action Search时,您的应用中只能有一个搜索活动。这意味着来自您的应用和其他人。例如,应该为您的活动添加权限,确保其他应用无法使用,除非是其功能。

<meta-data
    android:name="android.app.default_searchable"
    android:value=".ui.activity.SearchBookActivity" />

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

当启动与android.intent.action.SEARCH的Intent时,上面的代码将带来SearchBookActivity。那么你应该已经显示了将获得焦点的搜索视图布局。

另一种实现方式是使用不需要侦听SEARCH操作或定义任何默认搜索活动或权限的Fragment。

许多应用不需要此类功能,并且使用支持在ListViewRecyclerView中搜索的ListFragments。

无论哪种方式,无论您使用活动还是片段,都需要对菜单进行充气:

//来自片段

@Override
public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater )
{
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_search, menu);
}

//来自活动使用活动中的public boolean onCreateOptionsMenu(Menu menu)

使用menu_search.xml

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

    <item android:id="@+id/search"
          android:title="@string/search_label"
          android:icon="@drawable/ic_actionbar_search"
          app:actionViewClass="android.widget.SearchView"
          android:actionViewClass="android.widget.SearchView"
          app:showAsAction="always"/>
</menu>

最后但并非最不重要。您可以从MainActivity中删除此代码。在主要活动中,您只需要一个带有搜索图标的菜单项。

// Associate searchable configuration with the SearchView
SearchManager searchManager =
     (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView =
     (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(
    searchManager.getSearchableInfo(MainActivity.this.getComponentName()));

希望您实施搜索!!查看材料设计。