【问题标题】:Problems with compatible search bar in Android fragmentAndroid片段中兼容搜索栏的问题
【发布时间】: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


【解决方案1】:

对于任何想知道的人。 F%^k!@g 问题是 searchable.xml 文件中的“可搜索”标签大写必须全部小写。感谢 Eclipse 告诉我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多