-1

У меня есть одна проблема с изменением фрагментов, я использую spinner в панели действий, чтобы сделать это, а иногда и кнопку в alertdiaolog. И когда я нажимаю кнопку, у меня есть NullPointerException. Это мой код интерфейса обратного вызова:NullPointerException при изменении фрагмента и с использованием обратного вызова

public interface Callback { 
    public void load(String name); 
} 

И этот код моего первого фрагмента, я использую блесну в onCreateOptiontMenu:

private Callback callback; 

@Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     Log.d("TAG", "onAttach"); 
     try { 
     callback = (Callback) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement interface"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     callback = null; 
    } 

public void onCreateOptionsMenu(Menu menu, MenuInflater inflate) { 
     menu.clear(); 
     inflate.inflate(R.menu.kfu, menu); 
     spinner = (Spinner) menu.findItem(R.id.action_spinner).getActionView() 
       .findViewById(R.id.actionbar_spinner_change_map); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity() 
       .getBaseContext(), 
       android.R.layout.simple_spinner_dropdown_item, actions); 
     spinner.setAdapter(adapter); 
     spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, 
        int position, long id) { 
       Log.d("POSITION", "Position is = "+position); 
       switch (position) { 
       case 1: 
        if (parent.getItemAtPosition(position).equals("VKNews")) { 
       //  Log.d("Tag", callback.toString()+" "+ (callback == null) + " " + parent.getItemAtPosition(position)); 
         callback.load("VKNews"); //305 line 
        } 
       } 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       // TODO Auto-generated method stub 

      } 
     }); 
    } 

Во втором фрагменте я использую блесну, а иногда кнопку, чтобы изменить фрагмент:

private Callback callback; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     Log.d("TAG", "onAttach"); 
     try { 
     callback = (Callback) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() + " must implement interface"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     callback = null; 
    } 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
... 
if ((firstrun) || (account.access_token == null)) { 
      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
      builder.setTitle("Авторизация") 
        .setMessage(
          "для просмотра новостей необходимо авторизоваться.") 
        .setCancelable(false) 
        .setPositiveButton("Авторизоваться", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, 
             int id) { 
            editor1.putInt("isVk", 1).commit(); 
            editor1.apply(); 
            startLoginActivity(); 
           } 
          }) 
        .setNegativeButton("Отмена", 
          new DialogInterface.OnClickListener() { 
           public void onClick(DialogInterface dialog, 
             int id) {   
            editor1.putInt("isVk", 0).commit(); 
            editor1.apply(); 
            Log.d("TAG", callback.toString()); 
            callback.load("KFUNews"); 
            Log.d("CHANGE", "change working"); 
            dialog.cancel(); 
           } 
          }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
      // Save the state 
      getActivity() 
        .getSharedPreferences("PREFERENCE", 
          getActivity().MODE_PRIVATE).edit() 
        .putBoolean("firstrun", false).commit(); 
     } 
... 
} 


public void onCreateOptionsMenu(Menu menu, MenuInflater inflate) { 
     if (account.access_token != null || isChangedStat) { 
      inflate.inflate(R.menu.vk, menu); 
      spinner = (Spinner) menu.findItem(R.id.action_spinner1).getActionView() 
        .findViewById(R.id.actionbar_spinner_change_map); 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity() 
        .getBaseContext(), 
        android.R.layout.simple_spinner_dropdown_item, actions); 
      spinner.setAdapter(adapter); 
      spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

       @Override 
       public void onItemSelected(AdapterView<?> parent, View view, 
         int position, long id) { 
        Log.d("POSITION", "" + parent.getItemAtPosition(position)); 
        switch (position) { 
        case 1: 
         if (parent.getItemAtPosition(position).equals("KFUNews")) { 
          callback.load("KFUNews"); 
         } 
        } 
       } 

       @Override 
       public void onNothingSelected(AdapterView<?> parent) { 
        // TODO Auto-generated method stub 

       } 
      }); 

     } else { 
      inflate.inflate(R.menu.vk1, menu); 
      spinner = (Spinner) menu.findItem(R.id.action_spinner1).getActionView() 
        .findViewById(R.id.actionbar_spinner_change_map); 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity() 
        .getBaseContext(), 
        android.R.layout.simple_spinner_dropdown_item, actions); 
      spinner.setAdapter(adapter); 
      spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 

       @Override 
       public void onItemSelected(AdapterView<?> parent, View view, 
         int position, long id) { 
        Log.d("POSITION", "" + parent.getItemAtPosition(position)); 
        switch (position) { 
        case 1: 
         if (parent.getItemAtPosition(position).equals("KFUNews")) { 
          callback.load("KFUNews"); 
         } 
        } 
       } 

       @Override 
       public void onNothingSelected(AdapterView<?> parent) { 
        // TODO Auto-generated method stub 

       } 
      }); 
    } 
     super.onCreateOptionsMenu(menu, inflate); 
    } 

У меня есть nullpointer с первым фрагментом на 305 строке this callback.load ("VKNews");

Это мой журнал:

10-01 15:34:58.532: E/AndroidRuntime(2519): FATAL EXCEPTION: main 
10-01 15:34:58.532: E/AndroidRuntime(2519): java.lang.NullPointerException 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at ru.fosslabs.mobilestudent.fragment.KFUFragment$3.onItemSelected(KFUFragment.java:305) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at android.widget.AdapterView.fireOnSelected(AdapterView.java:892) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at android.widget.AdapterView.access$200(AdapterView.java:49) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:860) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at android.os.Handler.handleCallback(Handler.java:730) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at android.os.Handler.dispatchMessage(Handler.java:92) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at android.os.Looper.loop(Looper.java:137) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at java.lang.reflect.Method.invoke(Method.java:525) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-01 15:34:58.532: E/AndroidRuntime(2519):  at dalvik.system.NativeStart.main(Native Method) 

мой Активность:

public class GeneralActivity extends Activity implements Callback { 
... 
    @Override 
    public void load(String name) { 
     FragmentTransaction transaction = getFragmentManager() 
       .beginTransaction(); 
     Log.d("TAG", "transaction = " + transaction + " " 
       + (transaction == null)); 
     if (name.equals("KFUNews")) { 
      transaction.replace(R.id.general_fragment, kfu); 
      transaction.commit(); 
      invalidateOptionsMenu(); 
     } else { 
      transaction.replace(R.id.general_fragment, vkfrag); 
      transaction.commit(); 
      invalidateOptionsMenu(); 
     } 
    } 
} 

Обновление: это не работает на Android 4.2.2 и 4.3, 4.4

+0

осуществлять ли ваша деятельность интерфейс обратного вызова? –

+0

да. public class GeneralActivity extends Activity реализует Callback { – metalink

ответ

-1

три возможности :

  1. onAttach() не вызывается перед срабатыванием события, и callback никогда не устанавливается.
  2. onAttach() вызывается, но с нулевым значением для activity
  3. Detach) вызывается в какой-то момент (до события
0

Активность, вероятно, реализует неправильный интерфейс. Обратный вызов - это имя многочисленных интерфейсов. Убедитесь, что вы используете уникальное имя для интерфейса или изменить ваш GeneralActivity extends Activity implements Callback

в

GeneralActivity extends Activity implements ru.fosslabs.mobilestudent.fragment.KFUFragment.Callback

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