2015-10-08 2 views
0

В моем приложении я использую деятельность MainActivity и использование этой деятельности я начинаю FragmentTransaction, который взял меня нужно фрагмент имени экрана Welcomescreen и в Welcomescreen фрагменте я использовать обработчик для перехода к следующему фрагменту в фиксированное время интервал.

Проблема в том, что когда я нажимаю кнопку на Welcomescreen, фрагмент выходит из приложения, он дает мне java.lang.NullPointerException.Кнопка Назад нажимается дает NullPointerException в фрагменте



Так почему же это толкание java.lang.NullPointerException и как удалить эту ошибку ??

MainActivity.java

package com.example.gk; 

    import android.support.v4.app.FragmentManager; 
    import android.support.v4.app.FragmentTransaction; 
    import android.support.v4.view.ViewPager.LayoutParams; 
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 

    import android.view.Menu; 
    import android.view.MenuItem; 
    import android.widget.FrameLayout; 

    public class MainActivity extends AppCompatActivity { 

     //private static final int CONTENT_VIEW_ID = 10101010; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      FrameLayout frame = new FrameLayout(this); 

       frame.setId(R.id.listcontainer); 
       setContentView(frame, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 


       if (savedInstanceState == null) { 
        FragmentManager fragmentManager = getSupportFragmentManager(); 
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
        Welcomescreen welcome = new Welcomescreen(); 
        fragmentTransaction.add(R.id.listcontainer, welcome); 
        fragmentTransaction.commit(); 
       } 
      } 



     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.main, menu); 
      return true; 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      // Handle action bar item clicks here. The action bar will 
      // automatically handle clicks on the Home/Up button, so long 
      // as you specify a parent activity in AndroidManifest.xml. 
      int id = item.getItemId(); 
      if (id == R.id.action_settings) { 
       return true; 
      } 
      return super.onOptionsItemSelected(item); 
     } 

    } 

Welcomescreen.java

package com.example.gk; 

import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 

public class Welcomescreen extends android.support.v4.app.Fragment implements OnClickListener { 
    Handler handler; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     View view = inflater.inflate(R.layout.activity_main, container,false); 
     ImageView welcomeimage = (ImageView)view.findViewById(R.id.welome_image); 
     welcomeimage.setOnClickListener(this); 
     handler = new Handler(); 

     final Runnable r = new Runnable() { 
      public void run() { 

        FragmentManager fragmentManager = getFragmentManager(); 
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
        MainMenu menu = new MainMenu(); 
        fragmentTransaction.replace(R.id.listcontainer, menu); 
        fragmentTransaction.addToBackStack(null); 
        fragmentTransaction.commit(); 


      } 
     }; 

     handler.postDelayed(r, 7000); 
     return view; 
    } 




    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()){ 
     case R.id.welome_image: 
      FragmentManager fragmentManager = getFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      MainMenu menu = new MainMenu(); 
      fragmentTransaction.replace(R.id.listcontainer, menu); 
      fragmentTransaction.addToBackStack(null); 
      fragmentTransaction.commit(); 

     } 
    } 



} 

Logcat:

10-08 14:26:51.195: W/dalvikvm(10252): threadid=1: calling UncaughtExceptionHandler 
10-08 14:26:51.197: E/AndroidRuntime(10252): FATAL EXCEPTION: main 
10-08 14:26:51.197: E/AndroidRuntime(10252): Process: com.example.gk, PID: 10252 
10-08 14:26:51.197: E/AndroidRuntime(10252): java.lang.NullPointerException 
10-08 14:26:51.197: E/AndroidRuntime(10252): at com.example.gk.Welcomescreen$1.run(Welcomescreen.java:31) 
10-08 14:26:51.197: E/AndroidRuntime(10252): at android.os.Handler.handleCallback(Handler.java:808) 
10-08 14:26:51.197: E/AndroidRuntime(10252): at android.os.Handler.dispatchMessage(Handler.java:103) 
10-08 14:26:51.197: E/AndroidRuntime(10252): at android.os.Looper.loop(Looper.java:193) 
10-08 14:26:51.197: E/AndroidRuntime(10252): at android.app.ActivityThread.main(ActivityThread.java:5299) 
10-08 14:26:51.197: E/AndroidRuntime(10252): at java.lang.reflect.Method.invokeNative(Native Method) 
10-08 14:26:51.197: E/AndroidRuntime(10252): at java.lang.reflect.Method.invoke(Method.java:515) 
10-08 14:26:51.197: E/AndroidRuntime(10252): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825) 
10-08 14:26:51.197: E/AndroidRuntime(10252): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641) 
10-08 14:26:51.197: E/AndroidRuntime(10252): at dalvik.system.NativeStart.main(Native Method) 
+0

Какая строка кода представлена ​​линией 31? –

+0

@ThomasR. \t 'FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();' in Welcomescreen.java –

+1

Итак, ваш обработчик фрагмента равен NULL. Переопределите метод onActivityCreated() и выполните код транзакции фрагмента там, без обработчика и исполняемого материала. –

ответ

1

Не можете добавить код ниже в Welcomescreen Fragment?

@Override 
public void onStop() { 
    if (handler != null) { 
     handler.removeCallbacks(r); 
    } 
    super.onStop(); 
} 

Надеюсь, это вам поможет.

0

При нажатии кнопки назад активность получает (приостановленной | остановлено | разрушен) и эталонный объект действия ссылаются на нулевой указатель. В потоке, выполняющемся в фрагменте Welcomescreen, требуется ссылка на активность, но это значение равно null.

Проверить комментарий в следующем коде:

final Runnable r = new Runnable() { 
     public void run() { 

       FragmentManager fragmentManager = getFragmentManager(); // This line will throw exception as getFragmentManager() method uses activity reference. 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
       MainMenu menu = new MainMenu(); 
       fragmentTransaction.replace(R.id.listcontainer, menu); 
       fragmentTransaction.addToBackStack(null); 
       fragmentTransaction.commit(); 


     } 
    }; 
0

Настоятельно рекомендуется, чтобы все взаимодействия между фрагментами будут через контейнерную деятельность.

  1. Сохраните ссылку на приветственную деятельность в прикрепляемом фрагменте приветствия.
  2. Создайте публичный метод в действии, который изменяет текущий фрагмент , затем вызовите этот метод в своем фрагменте (в зависимости от щелчка \ интервал времени).
  3. В этом методе вызывается логика диспетчера фрагментов для изменения текущего фрагмента.

Вы также можете добиться этого, выполнив интерфейс, который изменяет фрагмент и отделяет соединение от активности приветствия.