переключение между макетами: onclicklistner приводит к сбою приложения

Я новичок в разработке под андроид. мое приложение падает, когда я использую код ниже, он отлично работает, если я удалю onclicklistner, вот код..

   int[] vmarray= {R.drawable.vm1bulb, R.drawable.vm2chair, R.drawable.vm3comb,
   R.drawable.vm4cycle,R.drawable.vm5dairy,R.drawable.vm6fan,R.drawable.vm7mobile,
   R.drawable.vm8pen,R.drawable.vm9shoes,R.drawable.vm10toothbrush,  
   R.drawable.vm11bangle, R.drawable.vm12watch};

        @Override
        protected void onCreate(Bundle savedInstanceState) {
     // TODO Auto-generated method stub

     super.onCreate(savedInstanceState);


    inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

     setContentView(R.layout.cacrvisualmem);

      firstview =(LinearLayout)this.findViewById(R.id.firsthumlayout);

    secondview = (LinearLayout) inflater.inflate(R.layout.cacrvisualmempart1, null);

   for(int i=0;i<6;i++)
     { 
     final int a = i;
     button_var[a] = (Button)findViewById(idArray[a]); 
     }

// В ПЕРВОМ МАКЕТЕ ЕСТЬ 6 КНОПОК И ИХ ФОН ЗАДАЕТСЯ СЛУЧАЙНО
// РИСУЕМ ИЗ МАССИВА "vmarray". следующий код для этого

     Random randomGenerator = new Random();
      Random rand6 = new Random();

     while (numbers.size() < 6) {
     random1 = randomGenerator.nextInt(12);
     random2 = rand6.nextInt(6);

      if (!numbers.contains(random1) && (!numbers2.contains(random2))) 
       {
           numbers.add(random1);

           numbers2.add(random2);  

           b[random2].setBackgroundResource(vmarray[random1]);
           count++;         

        }//if ends
     }//while ends

     Handler changeview = new Handler();

     Runnable r1 = new Runnable(){
        @Override
        public void run() {
            // TODO Auto-generated method stub

     // NOW, here, after 1 minute, second view will be inflated and button1  
     //  background is set to one the image from the array

            setContentView(secondview);

            b11=(Button)findViewById(R.id.button1);

            queryrandvar=queryrand.nextInt(12);

            switch(queryrandvar)
            {
            case 0:
                b11.setBackgroundResource(vmarray[0]);
                queryval=0;
                break;
            case 1:
                b11.setBackgroundResource(vmarray[1]);
                queryval=1;
                break;
            case 2:
                b11.setBackgroundResource(vmarray[2]);
                queryval=2;
                break;
            case 3:
                b11.setBackgroundResource(vmarray[3]);
                queryval=3;
                break;
            case 4:
                b11.setBackgroundResource(vmarray[4]);
                queryval=4;
                break;
            case 5:
                b11.setBackgroundResource(vmarray[5]);
                queryval= 5;
                break;
            case 6:
                b11.setBackgroundResource(vmarray[6]);
                queryval= 6;
                break;
            case 7:
                b11.setBackgroundResource(vmarray[7]);
                queryval= 7;
                break;
            case 8:
                b11.setBackgroundResource(vmarray[8]);
                queryval= 8;
                break;
            case 9:
                b11.setBackgroundResource(vmarray[9]);
                queryval= 9;
                break;
            case 10:
                b11.setBackgroundResource(vmarray[10]);
                queryval= 10;
                break;
            case 11:
                b11.setBackgroundResource(vmarray[11]);
                queryval= 11;
                break;

        }//switch ends


        }//run ends
     };//runnable ends

     b11.setOnClickListener(null);

     changeview.postDelayed(r1,10000);

  } //on create method ends here



    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    switch(v.getId())
    {
    case R.id.button1:
      {

       b11.setBackgroundResource(vmarray[1]);

       break;
      }




     }//switch ends
  }//onclick ends

если я удалю onclicklistner, он работает отлично, но его реализация приводит к сбою приложения, что не так с моим методом onclick или onclick listner

   LOGCAT IS AS FOLLOW




    07-20 03:06:15.980: E/AndroidRuntime(798): FATAL EXCEPTION: main
07-20 03:06:15.980: E/AndroidRuntime(798): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.univ.cog/com.univ.cog.Ca}: java.lang.NullPointerException
07-20 03:06:15.980: E/AndroidRuntime(798):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
07-20 03:06:15.980: E/AndroidRuntime(798):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
07-20 03:06:15.980: E/AndroidRuntime(798):  at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-20 03:06:15.980: E/AndroidRuntime(798):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
07-20 03:06:15.980: E/AndroidRuntime(798):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-20 03:06:15.980: E/AndroidRuntime(798):  at android.os.Looper.loop(Looper.java:137)
07-20 03:06:15.980: E/AndroidRuntime(798):  at android.app.ActivityThread.main(ActivityThread.java:5103)
07-20 03:06:15.980: E/AndroidRuntime(798):  at java.lang.reflect.Method.invokeNative(Native Method)
07-20 03:06:15.980: E/AndroidRuntime(798):  at java.lang.reflect.Method.invoke(Method.java:525)
07-20 03:06:15.980: E/AndroidRuntime(798):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
07-20 03:06:15.980: E/AndroidRuntime(798):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-20 03:06:15.980: E/AndroidRuntime(798):  at dalvik.system.NativeStart.main(Native Method)
07-20 03:06:15.980: E/AndroidRuntime(798): Caused by: java.lang.NullPointerException
07-20 03:06:15.980: E/AndroidRuntime(798):  at com.univ.cog.Ca.onCreate(Ca.java:162)
07-20 03:06:15.980: E/AndroidRuntime(798):  at android.app.Activity.performCreate(Activity.java:5133)
07-20 03:06:15.980: E/AndroidRuntime(798):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
07-20 03:06:15.980: E/AndroidRuntime(798):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
07-20 03:06:15.980: E/AndroidRuntime(798):  ... 11 more
07-20 03:06:16.040: W/ActivityManager(285):   Force finishing activity com.univ.cog/.Ca

person user3206535    schedule 20.07.2014    source источник


Ответы (2)


Здесь вы передали ноль

b11.setOnClickListener(null);


@Override
public void onClick(View v) {

    //here you getting v with value null, v.getId() throw NullPointerException

    switch(v.getId()){

        case R.id.button1:{

            b11.setBackgroundResource(vmarray[1]);

            break;
        }                                           

    }//switch ends
}//onclick ends

Отредактировано:

Если вы принимаете предложение изменить способ изменения макета, используйте RelativeLayout, LinearLayout с 2 перекрытиями, а затем управляйте видимостью.

public class MyActivity extends Activity {

    LinearLayout myContent1;
    LinearLayout myContent2;

    @Override
    public View onCreate( Bundle savedInstanceState ) {

        this.myContent1 = ( LinearLayout ) view.findViewById( R.id.content1 );
        this.myContent2 = ( LinearLayout ) view.findViewById( R.id.content1 );

        if ( /*some condition*/) {
            this.myContent1.setVisibility( View.VISIBLE );
        } else {
            this.myContent2.setVisibility( View.GONE );
        }
    }
}


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

        <LinearLayout
            android:id="@+id/content1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:visibility="gone" >
        </LinearLayout>

        <LinearLayout
            android:id="@+id/content2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:visibility="gone" >

        </LinearLayout>

</RelativeLayout>

Отредактировано еще раз: попробуйте это, чтобы увидеть, является ли ваша кнопка нулевой или нет.

b11=(Button)findViewById(R.id.button1)

if(b11 != null){

   b11.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

            }
    });

}else{

   System.out.println("Button is null");
}
person Anderson K    schedule 20.07.2014
comment
ДА, LOGCAT ТАКЖЕ ГОВОРИТ... КАК ЭТО РЕШИТЬ... Я ИЗМЕНИЛ b11.setonClicklistner(null) на b11.setonclicklistner(this), но все равно происходит сбой - person user3206535; 20.07.2014
comment
@ user3206535, в Runnable измените этот setContentView (secondview) на setContentView (R.layout.cacrvisualmempart1) - person Anderson K; 20.07.2014
comment
позвольте мне попробовать Андре ... но тот же код setContentView (secondview) отлично работает, когда onclicklistener удален. а затем я также могу обратиться к кнопке и изменить ее фон, но не могу щелкнуть по ней .. да .. сделал, как вы предложили .. та же проблема, дорогая. Опять вылетает :(:( - person user3206535; 20.07.2014
comment
@user3206535 user3206535, я отредактировал свой ответ, предложил предложение, которое мне кажется интересным, чтобы вы могли щелкнуть событие внутри Runnable и уменьшить вероятность исключения NullPointerException, удачи :)! - person Anderson K; 20.07.2014
comment
@user3206535 user3206535, извините, я еще раз взглянул на ваш сценарий, и еще раз я отредактировал свой ответ, но теперь поместите проверку на вашу кнопку, чтобы увидеть, совпадает ли она и отличается от нуля, прежде чем устанавливать событие щелчка! - person Anderson K; 20.07.2014
comment
Большое спасибо за ваше время... я посмотрю на это... с уважением - person user3206535; 20.07.2014
comment
Дорогой Андре, я сделал то же самое, теперь приложение не вылетает и следует шагу 1) отображает первые 6 изображений 2) работает и меняет макет на второе представление 3) второе представление раздувается, а кнопка 1 получает в качестве фона случайное изображение 4) ПРОБЛЕМА...ONCLICK НЕ Срабатывает...НЕ РАБОТАЕТ - person user3206535; 20.07.2014
comment
LOGCAT ГОВОРИТ, ЧТО КНОПКА НУЛЯ.. Я НЕ ПОНИМАЮ. когда я могу изменить фон этой кнопки 1 ПОСЛЕ ИЗМЕНЕНИЯ ВИДА, ПРОСТО, когда я хочу щелкнуть по ней, она дает BUTTON NULL. - person user3206535; 20.07.2014
comment
НАКОНЕЦ-ТО Я РЕШИЛ ЭТО... СПАСИБО @ANDRE ЗА ПОЛНУЮ ПОДДЕРЖКУ. Я ТАКЖЕ ДАЛ ОТВЕТ .. ЕЩЕ РАЗ СПАСИБО - person user3206535; 20.07.2014

Я ПОНЯЛ.. Я ПОСТАВИЛ СЛЕДУЮЩИЕ СТРОКИ ПОСЛЕ ЗАЯВЛЕНИЯ SWITCH ВНУТРИ RUNNABLE. РАБОТАЕТ ОТЛИЧНО БЕЗ СБОЯ ПРИЛОЖЕНИЯ.

                b11.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                b11.setBackgroundResource(vmarray[0]);//JUST TO CHECK
                }
             });
person user3206535    schedule 20.07.2014
comment
Хороший парень, разработчик и всегда пример преодоления :)! - person Anderson K; 20.07.2014
comment
БОЛЬШОЕ СПАСИБО...С уважением, АНДРЭ..СПАСИБО ЗА ПОДДЕРЖКУ - person user3206535; 21.07.2014
comment
Вы могли бы проголосовать за мой ответ, потому что моя помощь была актуальной :)! - person Anderson K; 22.07.2014
comment
да, и я тоже..но он требует минимум 15 репутации :(...а у меня ее нет... - person user3206535; 23.07.2014