Contextをクラス内で使いたい。
しかし、クラスをインスタンス化する場所でContextを取得できない事がある。
ので、MainActivityでインスタンス化して参照をViewModelで管理。フラグメントで共有使用。
各フラグメントでその都度渡せば良いんだけど。問題が起きたらそうしよう。
public class MainActivity extends AppCompatActivity {
private MainViewModel mViewModel = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 一部省略
mViewModel = new ViewModelProvider(this ).get(MainViewModel.class);
mViewModel.getMyMainModel().setValue( new MyMainModel(this) );
}
// 一部省略
}
【MainViewModel.java】インスタンスはMainActivityで作成。参照のみ管理させる。
public class MainViewModel extends ViewModel {
private MutableLiveData< MyMainModel> mData = new MutableLiveData< MyMainModel>(null);
public MutableLiveData< MyMainModel> getMyMainModel() { return mData;}
public MyMainModel getValueMyMainModel() { return mData.getValue();}
}
【MyMainModel.java】
public class MyMainModel {
public MyMainModel(Context context) {
mContext = context;
}
private Context mContext = null;
public Context getContext() { return mContext;}
public int getScreenWidth() {
WindowManager wManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
// 省略
Point realSize = new Point();
wManager.getDefaultDisplay().getSize(realSize);
return realSize.x;
}
// 省略
}
【MainFragment.java】
public class MainFragment extends Fragment implements View.OnTouchListener {
private MainViewModel mViewModel;
private GestureDetectorCompat mDetector;
class MyGestureListener extends SimpleOnGestureListener {
//省略
}
@Override
public boolean onTouch(View v, MotionEvent event) {
return mDetector.onTouchEvent(event);
}
public static MainFragment newInstance(String path) {
MainFragment mainFragment = new MainFragment();
Bundle args = new Bundle();
args.putString("path", path);
mainFragment.setArguments(args);
return mainFragment;
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
String path = "";
Bundle args = getArguments();
if(args != null )
path = args.getString("path");
mViewModel = new ViewModelProvider((ViewModelStoreOwner) requireContext()).get(MainViewModel.class);
mDetector = new GestureDetectorCompat(requireContext(), new MyGestureListener());
//省略
}
//省略
}
色々試してみて「できる」「できない」を確認する。
あ~面倒くさ。