4

ActionBarSherlockサポート ライブラリ v4を使用しています。これは「SherlockFragmentActivity」にあります。

以下で参照されるように、269 行目で Nullpointer を取得しています。SearchManager ではなく、SearchView が null であることを確認しました。もヌルですが、menuそれが正常かどうかはわかりません。 重要: 私の Android 4.0 および 4.1 テストでは null のみです。2.3では、うまく機能します!

ここに私のSearchViewコードがあります:

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

    SearchManager searchManager = 
        (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    SearchView searchView = 
        (SearchView) menu.findItem(R.id.menu_search).getActionView(); // line 269
    searchView.setSearchableInfo(
        searchManager.getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(true);
    searchView.setSubmitButtonEnabled(true);
    return true;
}

私は今これを私のメニュー項目として持っています。

 <item
    android:id="@+id/menu_search"
    android:actionViewClass="com.actionbarsherlock.widget.SearchView"
    android:icon="@android:drawable/ic_menu_search"
    android:showAsAction="always"
    android:title="search"/>

LogCat

FATAL EXCEPTION: main
java.lang.NullPointerException
 at com.---.---.master.MainFragmentActivity
    .setupSearchView(MainFragmentActivity.java:269)
 at com.---.---.master.MainFragmentActivity.onCreateOptionsMenu(
    MainFragmentActivity.java:258)
 at android.support.v4.app.Watson.onCreatePanelMenu(Watson.java:45)
 at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(
    ActionBarSherlock.java:559)
 at com.actionbarsherlock.internal.ActionBarSherlockCompat.preparePanel(
    ActionBarSherlockCompat.java:479)
 at com.actionbarsherlock.internal.ActionBarSherlockCompat
    .dispatchInvalidateOptionsMenu(ActionBarSherlockCompat.java:272)
 at com.actionbarsherlock.internal.ActionBarSherlockCompat$1.run(
    ActionBarSherlockCompat.java:984)
 at android.os.Handler.handleCallback(Handler.java:587)
 at android.os.Handler.dispatchMessage(Handler.java:92)
 at android.os.Looper.loop(Looper.java:123)
 at android.app.ActivityThread.main(ActivityThread.java:3683)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:507)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(
    ZygoteInit.java:839)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
 at dalvik.system.NativeStart.main(Native Method)

インポート:

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.app.SherlockListFragment;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.widget.SearchView;

import android.app.SearchManager;

ここでも、4.0 エミュレーターと 4.1 デバイスでのみ Null Pointer が発生します。アプリは 2.3 で問題なく動作します。かつて、ActionBarSherlock 以前は、SAME コードを使用しSearchViewていましたが、通常の方法 (Sherlock ではありません) を介してインポートすることを除いて、4.0 ではうまく機能していました。私は自分のアプリを下位互換性を持たせようとしていますが、新しい Android バージョンは壊れていますが、古いバージョンではうまく機能します。

編集: 実際には 2.3 では Null、4.0+ ではキャストの問題でしたが、メニュー項目 android:actionViewClass="android.app.SearchView" に変更し android:actionViewClass="com.actionbarsherlock.widget.SearchView" 、現在は 2.3 で修正済み、4.0+ では Null に変更しました

更新:ハックで修正したようです:

menu.xml の複製ファイルを追加したmenu-v11フォルダーを追加しましたが、1 つの項目のみが変更されています: android:actionViewClass="android.app.SearchView"。それ以外は、他の menu.xml ファイルと同じです。

Javaでは、これを行いました:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    MenuItem searchItem = menu.findItem(R.id.menu_search);
    SearchManager searchManager = 
        (SearchManager) getSystemService(Context.SEARCH_SERVICE);

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
        SearchView searchView = (SearchView) searchItem.getActionView();
        searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(true);
        searchView.setSubmitButtonEnabled(true);
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        setupNewSearchView(searchItem, searchManager);
    }
    return true;
}


@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void setupNewSearchView(MenuItem searchItem,
        SearchManager searchManager) {
    android.widget.SearchView searchView = 
        (android.widget.SearchView) searchItem.getActionView();
    searchView.setSearchableInfo(searchManager
        .getSearchableInfo(getComponentName()));
    searchView.setIconifiedByDefault(true);
    searchView.setSubmitButtonEnabled(true);
}

まあ、うまくいきますが、ハックのように見えるので、まだ答えにはしていません。より良いアイデアを受け入れますか?

4

3 に答える 3

2
于 2013-03-09T00:56:54.317 に答える
0

SearchViewという名前ですが、パッケージが異なる2つの完全に異なるクラスを使用しようとしています。あるクラスから別のクラスにオブジェクトを単純にキャストすることはできません。com.actionbarsherlock.widget.Searchviewは、android.widget.SearchViewとは異なります。したがって、searchView269行目はnullです。

Javaファイルの先頭からのインポートを確認することは私たちにとって重要です。

おそらく、R.id.menu_searchによって参照されるビューはandroid.widget.SearchViewであり、コードはそれがcom.actionbarsherlock.widget.Searchviewであることを想定しています。

于 2012-12-21T00:46:33.487 に答える
0

使用する予定の各アクティビティのタグの下にあるマニフェスト ファイルにテーマ属性を追加しますActionBar。独自のカスタム テーマを作成するか、 が提供するデフォルトのいずれかを使用できますActionBarSherlock

<activity
    android:name="com.example.MyActivityWithActionBar"
    ...
    android:theme="@style/Theme.Sherlock.Light">
</activity>

詳細情報:

于 2013-03-12T14:12:44.793 に答える