0

私は ExpandableListView を備えたアプリを持っており、すべてのヘッダーには独自のドローアブルが背景としてあります。コードは次のとおりです。

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB);
    {
        switch(groupPosition){
        case 0:
            convertView.setBackground(this._context.getResources().getDrawable(R.drawable.light_blue));
            break;
        case 1:
            convertView.setBackground(this._context.getResources().getDrawable(R.drawable.drugi_letniki_color));
            break;
        case 2:
            convertView.setBackground(this._context.getResources().getDrawable(R.drawable.light_blue));
            break;
        case 3:
            convertView.setBackground(this._context.getResources().getDrawable(R.drawable.cetrti_letniki_color));
            break;
        }
    }

これは、Android 4.3 を搭載した Samsung Galaxy Nexus では問題なく動作しますが、Android バージョン 2.2 を搭載したエミュレーターで試してみるとクラッシュします。

これは logcat ファイルです。

09-05 20:46:45.914: E/AndroidRuntime(371): FATAL EXCEPTION: main
09-05 20:46:45.914: E/AndroidRuntime(371): java.lang.NoSuchMethodError: android.view.View.setBackground
09-05 20:46:45.914: E/AndroidRuntime(371):  at com.whizzapps.stpsurniki.ExpandableListAdapter.getGroupView(ExpandableListAdapter.java:100)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:445)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.AbsListView.obtainView(AbsListView.java:1315)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.ListView.makeAndAddView(ListView.java:1727)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.ListView.fillDown(ListView.java:652)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.ListView.fillFromTop(ListView.java:709)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.ListView.layoutChildren(ListView.java:1580)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.AbsListView.onLayout(AbsListView.java:1147)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.view.View.layout(View.java:7035)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1238)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1044)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.view.View.layout(View.java:7035)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.view.View.layout(View.java:7035)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.view.View.layout(View.java:7035)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.view.View.layout(View.java:7035)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.os.Handler.dispatchMessage(Handler.java:99)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.os.Looper.loop(Looper.java:123)
09-05 20:46:45.914: E/AndroidRuntime(371):  at android.app.ActivityThread.main(ActivityThread.java:4627)
09-05 20:46:45.914: E/AndroidRuntime(371):  at java.lang.reflect.Method.invokeNative(Native Method)
09-05 20:46:45.914: E/AndroidRuntime(371):  at java.lang.reflect.Method.invoke(Method.java:521)
09-05 20:46:45.914: E/AndroidRuntime(371):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-05 20:46:45.914: E/AndroidRuntime(371):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-05 20:46:45.914: E/AndroidRuntime(371):  at dalvik.system.NativeStart.main(Native Method)

これは100行目です:

convertView.setBackground(this._context.getResources().getDrawable(R.drawable.light_blue));

ご覧のとおり、古いバージョンでカスタム背景を無効にすることで問題を解決しようとしましたが、if ステートメントを無視しているようです。

編集:私が問題をどのように正確に解決したのかまだ疑問に思っている人がいれば; コードは次のとおりです。

if (Build.VERSION.SDK_INT >= 16)
    {
        switch(groupPosition){
        case 0:
            convertView.setBackground(this._context.getResources().getDrawable(R.drawable.light_blue));
            break;
        case 1:
            convertView.setBackground(this._context.getResources().getDrawable(R.drawable.drugi_letniki_color));
            break;
        case 2:
            convertView.setBackground(this._context.getResources().getDrawable(R.drawable.light_blue));
            break;
        case 3:
            convertView.setBackground(this._context.getResources().getDrawable(R.drawable.cetrti_letniki_color));
            break;
        }
    }
    else if (Build.VERSION.SDK_INT < 16)
    {
        switch(groupPosition){
        case 0:
            convertView.setBackgroundDrawable(this._context.getResources().getDrawable(R.drawable.light_blue));
            break;
        case 1:
            convertView.setBackgroundDrawable(this._context.getResources().getDrawable(R.drawable.drugi_letniki_color));
            break;
        case 2:
            convertView.setBackgroundDrawable(this._context.getResources().getDrawable(R.drawable.light_blue));
            break;
        case 3:
            convertView.setBackgroundDrawable(this._context.getResources().getDrawable(R.drawable.cetrti_letniki_color));
            break;
        }
    }

これは、.setBackgroundDrawable は API 1 以降で使用できるのに対し、.setBackground は API 16 以降でのみ使用できるためです。

4

1 に答える 1

0

Build.VERSION_CODES.HONEYCOMBは 2.2 で定義されていないため、チェックが機能しない可能性があります。

チェックを行いたい場合は、定数を使用する必要があります。

編集

ifまた、ステートメントの後にセミコロンがあります。ifステートメントのコードブロックに入るかどうかを条件が実際に制御するように、それを削除する必要があります。

于 2013-09-05T20:51:17.097 に答える