2

Android アプリで Android の下位バージョンで ActionBar をサポートできるようにしようとしているので、ActionBarSherlock 4.2.0 を使用しています。より良い通知サポートのために、同じ開発者の「NotificationCompat2-1.1.2」も使用しています。

したがって、アプリには ActionBar タブがあり、これには ActionBar.TabListener を使用しています。これの私の実装は次のようになります。

public static class TabListener<T extends SherlockFragment> implements ActionBar.TabListener {
    private final SherlockFragmentActivity mActivity;
    private final String mTag;
    private final Class<T> mClass;
    private final Bundle mArgs;
    private android.support.v4.app.Fragment mFragment;

    public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) {
        this(activity, tag, clz, null);
    }

    public TabListener(SherlockFragmentActivity activity, String tag, Class<T> clz, Bundle args) {
        mActivity = activity;
        mTag = tag;
        mClass = clz;
        mArgs = args;

        // Check to see if we already have a fragment for this tab, probably
        // from a previously saved state.  If so, deactivate it, because our
        // initial state is that a tab isn't shown.
        mFragment = mActivity.getSupportFragmentManager().findFragmentByTag(mTag);
        if (mFragment != null && !mFragment.isDetached()) {
            FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
            ft.detach(mFragment);
            ft.commit();
        }
    }

    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        if (mFragment == null) {
            mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            ft.attach(mFragment);
        }
    }

    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
        if (mFragment != null) {
            ft.detach(mFragment);
        }
    }

    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
        //Do nothing
    }
}

私のフラグメントは SherlockFragment クラスを拡張します。

したがって、ActionBar をネイティブにサポートしていないデバイス、つまり Android バージョン 3.0 未満で実行しようとした場合を除いて、これはすべて正常に動作します。そのため、ActionBarSherlock は、実際に意図したとおりに正しく機能していないように見えます。

私が得るエラーは次のとおりです。

エラー/dalvikvm(330): メソッド com.shockwave.clockproj.ClockMain.onCreate 11-16 16:23:50.165 から参照されるクラス 'com.shockwave.clockproj.StopwatchFragment' が見つかりませんでした: エラー/AndroidRuntime(330): FATAL例外: メイン

   java.lang.NoClassDefFoundError: com.shockwave.clockproj.StopwatchFragment
    at com.shockwave.clockproj.ClockMain.onCreate(ClockMain.java:20)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
    at android.app.ActivityThread.access$1500(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    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)

エラーが表示される行は、次のようにタブをインスタンス化する場所です。

 ActionBar.Tab stopwatchTab = actionBar.newTab().setText("Stopwatch").setTabListener(new TabListener<StopwatchFragment>(this, "Stopwatch", StopwatchFragment.class));

そのため、明らかにフラグメントのクラス定義を見つけることができませんが、Android 2.3 以下でのみです。これを修正するにはどうすればよいですか?

4

2 に答える 2

3

これはActionBar.TabListener、ActionBarSherlock パッケージではなく Android パッケージからインポートされているために発生している可能性があります。

インポートがcom.actionbarsherlock.app.ActionBar.TabListener

編集: Shockwave はこれを自分で解決しましたが、他の人がこの問題に遭遇した場合: 下位の API レベルで ClassNotFound 例外が発生しているが、上位の API レベルで動作する場合は、デバッグするために実行できる手順がいくつかあります。

  • 最小 API レベルで使用できないインターフェースを実装していないことを確認してください (例: API レベル 11 より前のView.OnSystemUiVisibilityChangeListenerを使用)。

  • Android Lint を実行して、新しい API レベルでのみ使用可能なメソッドへの呼び出しを確認します。

于 2012-11-17T03:08:33.353 に答える
1

ここに画像の説明を入力 エクスポートするライブラリを追加してみてください。これは、コンパイル時にクラスが見つかったが実行時に見つからないために発生します。上の画像のように、エクスポートするライブラリを追加してみてください

あなたの場合のライブラリはシャーロックプロジェクトです

于 2012-11-17T02:28:14.890 に答える