0

Android 2.2アプリをAndroid 4で動作させる方法は? それは素晴らしいリファクタリング作業ですか?それとも、プロジェクトで変更するのはいくつかのsdk設定ですか?

ところで:どちらがより良いケースですか: - Android 4で動作する適応Android 2.2アプリ?- Google の互換パッケージを使用した Android 4 アプリ ?

前もって感謝します?

編集: 私のアプリは Android 2.2 と 2.3 では正常に動作しますが、Android 4 ではクラッシュするため、これをお願いします。

スタックトレース :

E/AndroidRuntime(  660): FATAL EXCEPTION: main
E/AndroidRuntime(  660): java.lang.RuntimeException: Unable to start activity ComponentInfo{vex.android/vex.android.controllers.ControllerLoginView}: java.lang.NullPointerException
E/AndroidRuntime(  660):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
E/AndroidRuntime(  660):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
E/AndroidRuntime(  660):    at android.app.ActivityThread.access$600(ActivityThread.java:123)
E/AndroidRuntime(  660):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
E/AndroidRuntime(  660):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  660):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(  660):    at android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime(  660):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  660):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(  660):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime(  660):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime(  660):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(  660): Caused by: java.lang.NullPointerException
E/AndroidRuntime(  660):    at vex.android.layout.layout_titleheader.setButtonVisibility(layout_titleheader.java:163)
E/AndroidRuntime(  660):    at vex.android.layout.layout_titleheader.setButtonVisibility(layout_titleheader.java:155)
E/AndroidRuntime(  660):    at vex.android.controllers.ControllerLoginView.Initialize(ControllerLoginView.java:58)
E/AndroidRuntime(  660):    at vex.android.definition.VexActivity.onStart(VexActivity.java:154)
E/AndroidRuntime(  660):    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133)
E/AndroidRuntime(  660):    at android.app.Activity.performStart(Activity.java:4475) 
E/AndroidRuntime(  660):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1929)
E/AndroidRuntime(  660):    ... 11 more

layout_titleheader.java :

    package vex.android.layout;

    import vex.android.R;
    import vex.android.controllers.ControllerInfo;
    import vex.android.definition.VexLayout;
    import vex.android.definition.iVexParentable;
    import vex.android.definition.intentCode;
    import android.app.Activity;
    import android.app.Instrumentation;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Handler;
    import android.os.SystemClock;
    import android.util.AttributeSet;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.ImageView;


    public class layout_titleheader extends VexLayout
    {
        /*** CONTROL POINTERS ***/
        Button nextButton;
        Button prevButton;
        ImageView infoButton;
        ImageButton upButton;
        ImageButton downButton;

        private Handler handler = new Handler(); 
        private Runnable upTask = new Runnable() { 
            public void run() {
                if(getContext() instanceof iVexParentable) {
                    ((iVexParentable)getContext()).onUpButton();
                }
                handler.postAtTime(this, SystemClock.uptimeMillis() +  100); 
            } 
        };
        private Runnable downTask = new Runnable() { 
            public void run() {
                if(getContext() instanceof iVexParentable) {
                    ((iVexParentable)getContext()).onDownButton();
                }
                handler.postAtTime(this, SystemClock.uptimeMillis() +  100); 
            } 
        };

        /**** CONSTRUCTORS ****/
        public layout_titleheader(Context context)
        {
            super(context);
            ((Activity)getContext()).getLayoutInflater().inflate(R.layout.layout_titleheader, this);
        }
        public layout_titleheader(Context context, AttributeSet attrs) {
            super(context, attrs);
            ((Activity)getContext()).getLayoutInflater().inflate(R.layout.layout_titleheader, this);
        }

        /**** INITIALIZERS ****/
        @Override
        public void Initialize()
        {
            infoButton.setOnTouchListener(new OnTouchListener(){
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if(event.getAction() == MotionEvent.ACTION_DOWN) 
                    {
                        showInfo();
                    }
                    return true;
                }
            });

            prevButton.setOnTouchListener(new OnTouchListener(){
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if(event.getAction() == MotionEvent.ACTION_DOWN)
                    {
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                Instrumentation i = new Instrumentation();
                                i.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
                            }
                        }).start();
                    }
                    return true;
                }
            });

            nextButton.setOnTouchListener(new OnTouchListener(){
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if(event.getAction() == MotionEvent.ACTION_DOWN)
                    {
                        if(getContext() instanceof iVexParentable)
                        {
                            ((iVexParentable)getContext()).onEditButton();
                        }
                    }
                    return true;
                }
            });
            upButton.setOnTouchListener(new OnTouchListener() {
                public boolean onTouch(View view, MotionEvent motionevent) {
                    int action = motionevent.getAction();
                    if (action == MotionEvent.ACTION_DOWN) {
                        handler.removeCallbacks(upTask);
                        handler.postAtTime(upTask, SystemClock.uptimeMillis() + 100);
                    } else if (action == MotionEvent.ACTION_UP) {
                        handler.removeCallbacks(upTask);
                    }
                    return false;
                }
            });

            downButton.setOnTouchListener(new OnTouchListener(){
                @Override
                public boolean onTouch(View v, MotionEvent motionevent) {
                    int action = motionevent.getAction();
                    if (action == MotionEvent.ACTION_DOWN) {
                        handler.removeCallbacks(downTask);
                        handler.postAtTime(downTask, SystemClock.uptimeMillis() + 100);
                    } else if (action == MotionEvent.ACTION_UP) {
                        handler.removeCallbacks(downTask);
                    }
                    return false;
                }
            });
        }

        @Override
        public void InitializeControls()
        {
            infoButton = (ImageView)findViewById(R.id.infoButton);
            prevButton = (Button)findViewById(R.id.prevButton);
            nextButton = (Button)findViewById(R.id.nextButton);
            upButton = (ImageButton)findViewById(R.id.upButton);
            downButton = (ImageButton)findViewById(R.id.downButton);
        }

        /**** LOCAL METHODS ****/
        public void showInfo()
        {
            if(getContext() instanceof Activity)
            {
                Intent intent = new Intent(getContext(), ControllerInfo.class);
                ((Activity)getContext()).startActivityForResult(intent, intentCode.INFO_DOSTART);
            }
        }
        public void setButtonVisibility( int previousButton, int editButton, int helpButton)
        {
            setButtonVisibility(previousButton, editButton, helpButton, View.INVISIBLE, View.INVISIBLE);
        }

        public void setButtonVisibility( int previousButton, int editButton, int helpButton, int upButtonVisibility, int downButtonVisibility)
        {
            if (View.VISIBLE == previousButton) {// fixes issue of translation not correctly displayed
                prevButton.setText(getContext().getString(R.string.Back));
            }
            prevButton.setVisibility(previousButton);
            nextButton.setVisibility(editButton);
            infoButton.setVisibility(helpButton);
            upButton.setVisibility(upButtonVisibility);
            downButton.setVisibility(downButtonVisibility);
        }

        public void setPreviousButtonText(int id) {
            prevButton.setText(getContext().getString(id));
        }

        public void setEditButtonName(int resId)
        {
            nextButton.setText(resId);
        }
    }

掘り下げた後、Android 4の実行時にVexLayoutでオーバーライドされたViewクラスのonFinishInflate()が呼び出されないことがわかりました。何か考えはありますか?

4

3 に答える 3

1

Android プラットフォームは一般的に上位互換性があります。これは、SDK 8 (2.2) 用にアプリを作成でき、4.0 で実行できることを意味します。

更新: ビュー (prevButtonまたは などnextButton) の 1 つが null に等しいかどうか、getContextまたはContext.getString(int)メソッド setButtonVisibility(int, int, int, int, int) で null を返すかどうかを確認してください。

于 2012-04-06T11:29:19.533 に答える
0

Android には下位互換性があるため、Android 2.2 用に作成されたアプリは Android 4 でも動作するはずです。

于 2012-04-06T11:28:30.063 に答える
0

可能です。android4にインストールしようとすると、正常にインストールされると思います。しかし、その逆を試みると、それは不可能です。Android 4 が提供する多くの事前変更があるためです。

于 2012-04-06T11:29:16.523 に答える