Я приложение для кодирования истории, и я хочу, чтобы пользователь мог изменять размер, шрифт содержимого. Изменение значения выполняется в действии и отправляется на фрагмент через интерфейс. Но у меня проблема с интерфейсом (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
Да, это работает! Tks bro – hungdh0x5e