0

LinearLayout cannot be cast to android.widget.checkboxに投稿した以前の問題の解決策を得ました。しかし、新たな問題が発生しました。action.xml ファイルには次のものがあります。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item 
     android:id="@+id/location"
     android:actionLayout="@layout/action_location"
     android:showAsAction="never"
     android:title="location">

</item>
<item 
    android:id="@+id/save" 
    android:title="Save" 
    android:showAsAction="always">

</item>
<item 
    android:id="@+id/saveBackground" 
    android:showAsAction="always|withText"
    android:title="in BG">

</item>

上記のxmlファイルを使用すると、正常に動作します。ただし、次のように変更すると、起動時に NullPointerException エラーが発生します。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >


<item 
    android:id="@+id/save" 
    android:title="Save" 
    android:showAsAction="always">

</item>
<item 
    android:id="@+id/saveBackground" 
    android:showAsAction="always|withText"
    android:title="in BG">

</item>
<item 
     android:id="@+id/location"
     android:actionLayout="@layout/action_location"
     android:showAsAction="never"
     android:title="location">

</item>


</menu>

メニュー内のid locationを持つ menuitem の配置はどのように重要ですか? 参照が取得されているのはid経由ではありませんか?

また、最初の xml ファイルを使用してアプリを起動しても、チェックボックスの小さなボックスは表示されません。面白いことに、id location を持つ menuitem の属性がandroid:showAsAction="always|withText"に変更されると、チェックボックスの小さなボックスが表示されますが、テキストは表示されません。

私はこれを回避することができませんでした。助けてください..

[更新 1]

Logcat からのスタック トレース全体を次に示します。

07-24 09:41:49.539: E/AndroidRuntime(2354): FATAL EXCEPTION: main
07-24 09:41:49.539: E/AndroidRuntime(2354): java.lang.NullPointerException
07-24 09:41:49.539: E/AndroidRuntime(2354):     at com.example.files_readwrite.FilesDemoActivity.onCreateOptionsMenu(FilesDemoActivity.java:29)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at android.support.v4.app.Watson.onCreatePanelMenu(Watson.java:44)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:559)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at com.actionbarsherlock.internal.ActionBarSherlockNative.dispatchCreateOptionsMenu(ActionBarSherlockNative.java:65)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at com.actionbarsherlock.app.SherlockFragmentActivity.onCreatePanelMenu(SherlockFragmentActivity.java:165)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at com.android.internal.policy.impl.PhoneWindow.preparePanel(PhoneWindow.java:411)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:784)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at com.android.internal.policy.impl.PhoneWindow$1.run(PhoneWindow.java:205)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at android.view.Choreographer.doCallbacks(Choreographer.java:579)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at android.view.Choreographer.doFrame(Choreographer.java:547)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at android.os.Handler.handleCallback(Handler.java:725)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at android.os.Handler.dispatchMessage(Handler.java:92)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at android.os.Looper.loop(Looper.java:153)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at android.app.ActivityThread.main(ActivityThread.java:5297)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at java.lang.reflect.Method.invokeNative(Native Method)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at java.lang.reflect.Method.invoke(Method.java:511)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-24 09:41:49.539: E/AndroidRuntime(2354):     at dalvik.system.NativeStart.main(Native Method)

[UPDATE 2] FilesDemoActivity.java の 29 行目には

external=(CheckBox) menu.findItem(R.id.location).getActionView().findViewById(R.id.external);

この行がコメントアウトされている場合、正常に実行されます。しかし、チェックボックスへの参照を取得したいです。

[更新 3] action_location.xmlの内容は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<CheckBox 
    android:id="@+id/external"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:title="@+string/external"
    />


</LinearLayout>
4

2 に答える 2

1

子レイアウトへの参照を見つけようとしているので、正しい XML ファイルをターゲットにする必要があります。Android はそれ自体を行うことができません。

編集 1、更新します。それが機能するかどうかを確認するためにプロジェクトを開始しました。現在はそうです。以下を参照してください。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.action, menu);

    // inflate parent view      
    View parentView = null;
    Log.d(null,"159 - foo --");
    // then inflate the xml, that it exists on android
    try {
        LayoutInflater inflater = LayoutInflater.from(this.getBaseContext());
        parentView = inflater.inflate(R.layout.action_location, null);
    }
    catch (Exception e) {
        Log.d(null, "159 - error after inflater : " + e.getMessage());
    }
    Log.d(null,"159 - bar --");
    View childView = parentView.findViewById(R.id.external);
    Log.d(null,"159 - success --");
    return true;
}

その結果、foo + bar + success がログに記録されます。それでうまくいきます。Android には実行時に action_location.xml が含まれていなかったため、LayoutInflater で調整する必要がありました。

于 2013-07-24T09:46:22.787 に答える