Beim Versuch, der ActionBar in meiner Aktivität ein SearchView-Widget hinzuzufügen, ist ein Problem aufgetreten. Beim Aufruf von getActionView erhalte ich einen Nullwert, um mein SearchView-Objekt abzurufen.
Ich bin dem Android Developer Guide gefolgt und habe auch eine Menge SO - Fragen sowie einige andere Links im Internet gelesen. alles vergebens. Es könnte etwas einfaches sein, aber ich konnte es nicht herausfinden - es scheint mir, dass mein Code im Wesentlichen der gleiche ist wie der von google (abgesehen von dem Ändern einiger Namen usw.), aber es funktioniert trotzdem nicht.
Jede Hilfe wäre dankbar.
Nachfolgend sind relevante Bits des Codes enthalten. Bitte lassen Sie mich wissen, wenn Ihnen etwas unklar ist, wenn Sie eine Ahnung haben, was möglicherweise falsch ist.
Aktivitätscode:
private ListView workflowListView;
private DrawerLayout drawerLayout;
private ListView drawerList;
private ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_workflow_list);
workflowListView = (ListView) findViewById(R.id.workflowListView);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerList = (ListView) findViewById(R.id.drawer_list);
drawerToggle = new ActionBarDrawerToggle(
this, /* Host Activity */
drawerLayout, /* DrawerLayout object */
R.drawable.ic_launcher, /* nav drawer icon to replace 'Up' caret */
R.string.app_name, /* "open drawer" description */
R.string.app_name /* "close drawer" description */
) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
// getActionBar().setTitle("Closed drawer");
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
// getActionBar().setTitle("Open drawer");
}
};
drawerLayout.setDrawerListener(drawerToggle);
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setIcon(Android.R.color.transparent);
String[] testData = {"a", "b", "c", "d"};
ArrayList<String> workflowList = new ArrayList<String>();
for (String s : testData) {
workflowList.add(s);
}
ArrayAdapter<String> workflowAdapter = new ArrayAdapter<String>(this.getApplicationContext(), R.layout.workflow_list_item, workflowList);
workflowListView.setAdapter(workflowAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.workflow_list, menu);
inflater.inflate(R.menu.options_menu, menu);
// Associate searchable configuration with the SearchView
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
// The below line returned null even though it was used in Google sample code
SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
return super.onCreateOptionsMenu(menu);
}
xml/searchable.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_hint"
Android:includeInGlobalSearch="false" />
menu/options_menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<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_title"
Android:icon="@drawable/ic_action_search"
Android:showAsAction="always|collapseActionView"
Android:actionViewClass="Android.support.v7.widget.SearchView" />
</menu>
Versuchen Sie, die fehlerhafte Zeile durch Folgendes zu ersetzen:
mSearchMenuItem = menu.findItem(R.id.action_search);
mSearchView = (EnglishVerbSearchView) MenuItemCompat.getActionView(mSearchMenuItem);
Wobei R.id.action_search die ID Ihres Suchbegriffs im Menü ist.
EDIT
Ihr Manifest sollte so aussehen:
<activity
Android:name="com.bronzelabs.twc.activities.WorkflowListActivity"
Android:label="@string/app_name"
Android:theme="@style/Theme.AppCompat.Light" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
Android:name=".activities.SearchResultActivity"
Android:theme="@style/Theme.AppCompat.Light"
Android:launchMode="singleTop">
<intent-filter>
<action Android:name="Android.intent.action.SEARCH" />
</intent-filter>
<meta-data Android:name="Android.app.searchable" Android:resource="@xml/searchable"
Android:value=".activities.SearchResultActivity" />
</activity>
So rufen Sie setSearchableInfo
auf:
mSearchView.setSearchableInfo(searchManager.getSearchableInfo(
new ComponentName(getApplicationContext(), SearchResultActivity.class)));
EDIT 2
Stellen Sie sicher, dass Ihre Menü-XML-Datei so ist (achten Sie auf diese beiden Attribute mit dem Namespace yourapp
- dies ist erforderlich, wenn Sie die kompatible Bibliothek verwenden):
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:yourapp="http://schemas.Android.com/apk/res-auto" >
<item Android:id="@+id/action_search"
Android:title="@string/action_search"
Android:icon="@drawable/action_search"
yourapp:showAsAction="always|collapseActionView"
yourapp:actionViewClass="Android.support.v7.widget.SearchView" />
</menu>
Überprüfen Sie zunächst, ob Sie den app - Namespace für actionViewClass verwenden.
Android:actionViewClass="Android.support.v7.widget.SearchView"
- dies wirft NPE
app:actionViewClass="Android.support.v7.widget.SearchView"
- verwenden Sie diesen
und zweitens
Prüfen Sie, ob Sie samesearchView
in menu.xml
und in Ihrer Activity verwenden.
Ich hatte wahrscheinlich ein ähnliches Bild, das in meinen Release-Builds enthalten war, nicht jedoch meine Debug-Builds, wenn auf die v21-Support-Bibliothek umgestellt wurde. Es stellte sich heraus, dass dies ein Problem der Verschleierung war, und das Hinzufügen dieser Zeile zu meiner Datei proguard-rules.txt behebte das Problem:
-keep class Android.support.v7.widget.SearchView { *; }
Ich hatte ein sehr ähnliches Problem, bei dem die folgende Zeile null zurückgab
SearchView searchView = (Android.support.v7.widget.SearchView)MenuItemCompat.getActionView(searchMenuItem);
Das Update befand sich in meiner styles.xml
-Datei. Ich änderte das übergeordnete Element meiner AppTheme in Theme.AppCompat.Light
.
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
für mich ist das die richtige Antwort: Verwenden Sie in menu/options_menu.xml Folgendes:
app:actionViewClass="Android.support.v7.widget.SearchView"
Für jeden, der noch auf der Suche ist, habe ich alles weiter oben verfolgt und konnte die Dinge nicht in Gang bringen. Ich habe meine searchView.setSearchableInfo in einen Null-Check verpackt und voila! Es lief genau so, wie es sollte.
if (searchView != null) {
searchView.setSearchableInfo(searchManager.getSearchableInfo(
new ComponentName(getApplicationContext(), SearchActivity.class)));
}
Ich denke, Sie besetzen FragmentActivity müssen Sie erweitern von ActionBarActivity