Я использовал встроенный Viewpager
fragment
и адаптировался к ночному режиму. Когда я включил ночной режим, я обнаружил, что действие было восстановлено, и, конечно, фрагмент также был.
Режим Ngiht: UiModeManager.setNightMode(android.app.UiModeManager.MODE_NIGHT_YES);
Я думаю, они перезагружают ресурсы, предназначенные для ночного режима, и перезагружают представление. Но когда я инициализирую recyclerView
(в одном из фрагментов), он становится нулевым.
Если я положу всю инициализацию в onCreateView
, похоже, она инициализируется нормально. Но я называю это из активности, это все еще нуль
MainActivity
: url
// in MainActivity
if (isDarkMode) {
PreferenceUtil.getDefault(MainActivity.this)
.edit().putBoolean(Values.SharedPrefsTag.DARK_MODE, false).apply();
UiModeManager UiModeManager = (UiModeManager) getSystemService(Context.UI_MODE_SERVICE);
UiModeManager.setNightMode(android.app.UiModeManager.MODE_NIGHT_NO);
mMainBinding.navigationView.getMenu().findItem(R.id.dart_mode).setChecked(false);
} else {
PreferenceUtil.getDefault(MainActivity.this)
.edit().putBoolean(Values.SharedPrefsTag.DARK_MODE, true).apply();
UiModeManager UiModeManager = (UiModeManager) getSystemService(Context.UI_MODE_SERVICE);
UiModeManager.setNightMode(android.app.UiModeManager.MODE_NIGHT_YES);
mMainBinding.navigationView.getMenu().findItem(R.id.dart_mode).setChecked(true);
}
public final class MusicListFragment extends BaseListFragment {
public static final String TAG = "MusicListFragment";
public FragmentMusicListBinding mMusicListBinding;
private MyRecyclerAdapter adapter;
private MainActivity mActivity;
@Override
public void reloadData() {
Data.sMusicItems.clear();
Data.sMusicItemsBackUp.clear();
adapter.notifyDataSetChanged();
loadData();
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mMusicListBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_music_list, container, false);
loadData();
return mMusicListBinding.getRoot();
}
public void initRecyclerView() {
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mActivity) {
@Override
protected int getExtraLayoutSpace(RecyclerView.State state) {
return 700;
}
};
linearLayoutManager.setItemPrefetchEnabled(true);
linearLayoutManager.setInitialPrefetchItemCount(15);
adapter = new MyRecyclerAdapter(mActivity, Data.sMusicItems
, new MyRecyclerAdapter.Config(PreferenceUtil.getDefault(mActivity).getInt(Values.SharedPrefsTag
.RECYCLER_VIEW_ITEM_STYLE, 0), true));
mMusicListBinding.includeRecycler.recyclerView.setLayoutManager(linearLayoutManager);
mMusicListBinding.includeRecycler.recyclerView.setHasFixedSize(true);
mMusicListBinding.includeRecycler.recyclerView.setItemViewCacheSize(15);
mMusicListBinding.includeRecycler.recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
GlideApp.with(mActivity).resumeRequests();
} else {
GlideApp.with(mActivity).pauseRequests();
}
}
});
mMusicListBinding.includeRecycler.recyclerView.setAdapter(adapter);
}
}
Когда я установлю ночной режим, MainActivity
вызовет initRecyclerView()
метод musicListActivity
, но у него будет нулевой указатель. Но я нормально запускаю приложение нормально.