2016-02-20 4 views
0

Я приложение для кодирования истории, и я хочу, чтобы пользователь мог изменять размер, шрифт содержимого. Изменение значения выполняется в действии и отправляется на фрагмент через интерфейс. Но у меня проблема с интерфейсом (NullPointer), onSettingChangedListener не имеет значения null, когда я звоню setOnSettingChangedListener, но когда я зарегистрирую номер setSize(), тогда null. Пожалуйста, скажи мне почему?Связь между активностью и фрагментом

Вот код

ChapterActivity.class

public class ChapterActivity extends AppCompatActivity { 

    private OnSettingChangedListener onSettingChangedListener; 

    private static ChapterActivity mInstances; 

    public static ChapterActivity getInstance() { 
     if (mInstances == null) 
      mInstances = new ChapterActivity(); 
     return mInstances; 
    } 

    private void setSize(int mode) { 
     text_size = mode; 
     SharedManager.putInt(mContext, PREF_TEXT_SIZE, text_size); 
     if (onSettingChangedListener != null) 
      onSettingChangedListener.onTextSizeChanged(mode); 
     Log.d(TAG, "setSize: " + (onSettingChangedListener == null ? " Null" : " not null")); 
    } 

    public interface OnSettingChangedListener { 
     public void onTextSizeChanged(int mode); 

     public void onTextFontChanged(String fontName); 
    } 

    public void setOnSettingChangedListener(OnSettingChangedListener onSettingChangedListener) { 
     this.onSettingChangedListener = onSettingChangedListener; 
     Log.d(TAG, "setOnSetting: " + (onSettingChangedListener == null ? " Null" : "Not null")); 
    } 
} 

ChapterFragment

public class ChapterFragment extends Fragment 
    implements ChapterActivity.OnSettingChangedListener { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.content_chapter, container, false); 
     mContext = getActivity(); 

     txtContent = (TextView) view.findViewById(R.id.txtContent); 
     txtTitle = (TextView) view.findViewById(R.id.txtTitle); 
     // Add Listener 
     ChapterActivity.getInstance().setOnSettingChangedListener(this); 

     return v; 
    } 


    @Override 
    public void onTextSizeChanged(int mode) { 
     Log.d(TAG, String.valueOf(mode)); 
     if (mode == ChapterActivity.TEXT_SIZE.SMALL.id) { 
      setTextAppearance(android.R.style.TextAppearance_Material_Small); 
     } else if (mode == ChapterActivity.TEXT_SIZE.MEDIUM.id) { 
      setTextAppearance(android.R.style.TextAppearance_Material_Medium); 
     } else { 
      setTextAppearance(android.R.style.TextAppearance_Material_Large); 
     } 
    } 

    @Override 
    public void onTextFontChanged(String fontName) { 
     Log.d(TAG, fontName); 
    } 
} 

Logcat:

setOnSetting: not null setSize: null

ответ

3

Не обращайтесь со своей деятельностью как Singleton. Наличие метода getInstance() не работает, так как Android Framework обрабатывает действия для вас, и тот, который вы создаете самостоятельно, не будет использоваться так, как вы думаете.

Вам необходимо активировать вашу ChapterFragment и установить обратный вызов на этом.

Изменение: ChapterActivity.getInstance().setOnSettingChangedListener(this);
To: ((ChapterActivity) getActivity()).setOnSettingChangedListener(this)

Или удалите эту строку и добавьте ниже метод ChapterFragment.

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    ((ChapterActivity) activity).setOnSettingChangedListener(this); 
} 

Если вы используете библиотеку поддержки для фрагментов или ориентируетесь API 23+ новый метод onAttach принимает контекст в качестве параметра вместо:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    ((ChapterActivity) context).setOnSettingChangedListener(this); 
} 
+0

Да, это работает! Tks bro – hungdh0x5e

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