2012-04-06 8 views
0

как сделать приложение для Android 2.2 работать в android 4? Отличная работа по рефакторингу? или это просто некоторые настройки sdk для изменения в проекте?Как сделать приложение Android для Android 2.2?

BTW: какой лучший случай: - адаптированное приложение для Android 2.2, которое будет работать с Android 4? - Android-приложение с пакетом совместимости от Google?

Заранее спасибо?

EDIT: Я спрашиваю это потому, что мое приложение работает отлично в андроид 2.2 и 2.3, но сбои в андроида 4.

StackTrace:

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); 
     } 
    } 

После некоторого копания я обнаружил, что onFinishInflate() из класса View, который переопределен в VexLayout, НЕ вызывается при запуске Android 4. Любая идея?

+0

Если вы предоставляете сброс стека аварии, кто-то, вероятно, сможет вам помочь. – mah

+0

Пожалуйста, покажите нам свой 'layout_titleheader.java'. – pepyakin

+0

добавлено в вопрос :) – Alexis

ответ

1

Платформа для Android, как правило, совместима с переносчиком. Это означает, что вы можете написать свое приложение для SDK 8 (2.2), и оно будет работать в версии 4.0.

UPDATE: Попытки проверить, равна ли один представления (например prevButton или nextButton) неопределенные, getContext или Context.getString(int) возвращает нуль в методе setButtonVisibility (INT, INT, INT, INT, INT)

+0

Действительно на android 4 nextButton равно null в момент, когда setButtonVisibility вызывается, но не в android 2.2. Как это возможно? – Alexis

+0

Hm. Можете ли вы отправить мне проект приложения с источниками? – pepyakin

+0

Наконец-то я отладил его, но это все еще странно: http://stackoverflow.com/questions/10088751/why-onfinishinflate-isnt-called-on-my-android-views-in-android-4 – Alexis

0

Android имеет обратную совместимость, поэтому приложение написано для андроид 2.2 должен работать на андроид 4.

0

Это возможно. Я думаю, что если вы попытаетесь установить его в Android 4, он будет установлен нормально. Но если вы попробуете наоборот, тогда это невозможно. Потому что есть много предварительных изменений, которые предоставляет андроид 4.

Смежные вопросы