【发布时间】:2014-04-24 18:48:41
【问题描述】:
我正在发疯,试图弄清楚如何使搜索栏(在 ActionBar 中)正常工作,但仍保持与 Gingerbread 的兼容性。我遇到的第一个问题是,仅将 v7 支持库 jar 放在 libs 文件夹中,或将其添加为依赖项,都不起作用:我在菜单 xml 中收到错误“找不到属性‘actionViewClass’的资源标识符”在包中...我认为这是因为 jar 中没有资源。我发现解决第一个问题的唯一方法是下载实际的 v7 支持项目,导入 Eclipse,然后让我的项目指向v7 库。这是唯一的方法吗?
其次,我一辈子都不能在活动中调用 onNewIntent。当我单击搜索图标时,搜索编辑文本会正常打开。然后我输入一些文本并单击搜索键(或输入 sim),没有任何反应。 onNewIntent 应该被调用,因为我已将活动设置为清单中的搜索意图,但没有任何反应。任何帮助将不胜感激。
我的菜单 xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:appcompat="http://schemas.android.com/apk/res-auto" >
<item android:id="@+id/menu_search"
android:icon="@drawable/ic_menu_search"
android:title="@string/search"
appcompat:actionViewClass="android.support.v7.widget.SearchView"
appcompat:showAsAction="always" />
</menu>
我的清单:
<activity android:name="com.random.search.SearchBarCompatActivity"
android:launchMode="singleTop"
android:theme="@style/Theme/AppCompat.Light.DarkActionBar" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
我的活动:
import android.app.SearchManager;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.widget.TextView;
import android.support.v7.app.ActionBarActivity;
import com.random.R;
public class SearchBarCompatActivity extends ActionBarActivity
{
@Override
public void onCreate(Bundle state)
{
super.onCreate(state);
setContentView(R.layout.fragment_and_activity_container);
TextView mDescriptionBox = (TextView)findViewById(R.id.desc_box);
if (mDescriptionBox != null)
mDescriptionBox.setText(getString(R.string.search_bar_compat_desc));
// Load main fragment
FragmentManager manager = getSupportFragmentManager();
Fragment mainFragment = manager.findFragmentById(R.id.fragment_container);
if (mainFragment == null) {
mainFragment = new SearchBarCompatFragment();
manager.beginTransaction().add(R.id.fragment_container, mainFragment).commit();
}
}
/** On New Intent
*
* Called automatically when a new search string has been sent. Calls the
* fragment to display the string in a Toast.
*
* @param intent
*/
@Override
public void onNewIntent(Intent intent)
{
Log.d("Activity", "New Intent received.");
setIntent(intent);
if (Intent.ACTION_SEARCH.equals(intent.getAction()))
{
String query = intent.getStringExtra(SearchManager.QUERY);
SearchBarCompatFragment frag = (SearchBarCompatFragment)getSupportFragmentManager()
.findFragmentById(R.id.fragment_container);
frag.showSearchString(query);
}
}
}
我的片段:
import android.app.Activity;
import android.app.SearchManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.SearchView;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
import com.random.R;
public class SearchBarCompatFragment extends Fragment
{
private Context mContext;
private SearchView mSearchField;
/** On Create */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.mContext = getActivity();
// Enable menu
setHasOptionsMenu(true);
}
/** On Create Options Menu
*
* Inflates the menu
*
* @param Menu menu
* @param MenuInflater inflater
*/
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
inflater.inflate(R.menu.search_bar_compat_menu, menu);
Log.d("Fragment", "Creating options menu...");
mSearchField = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search));
if (mSearchField != null)
{
mSearchField.setIconifiedByDefault(false);
SearchManager sm = (SearchManager) getActivity().getSystemService(Activity.SEARCH_SERVICE);
mSearchField.setSearchableInfo(sm.getSearchableInfo(getActivity().getComponentName()));
mSearchField.setQuery(getActivity().getIntent().getStringExtra(SearchManager.QUERY), false);
}
}
/** On Options Item Selected
*
* Handle Quit and Sync menu items.
*
* @param MenuItem item
*/
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
Log.d("Fragment", "onOptionsItemSelected called");
switch(item.getItemId())
{
case R.id.menu_search:
getActivity().onSearchRequested();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/** Show Search String
*
* Called from Activity when a search string is returned. Shows
* that a Fragment can deal with the results.
*
* @param query
*/
public void showSearchString(String query)
{
Log.d("Fragment", "Displaying toast...");
Toast.makeText(mContext, "Search string: " + query, Toast.LENGTH_SHORT).show();
}
}
我的可搜索 xml:
<?xml version="1.0" encoding="utf-8"?>
<Searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/app_name"
android:hint="@string/search" >
</Searchable>
【问题讨论】:
-
哇,我难倒了很多人。我很高兴知道我没有疯,这也不是一件简单的事情。
-
即使有人可以提供一个有效示例的链接,我也会很感激。它必须与 Gingerbread 兼容并使用兼容性库。
标签: android search android-fragments