タブレット用プログラムの書き止め

android OS & iPadOS の記録。

Fragment+ViewModel [基礎] 都合の良いように手を加える。

2022-10-01 17:06:41 | Android studio 日記

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());

 

        //省略
    }
    //省略
}


色々試してみて「できる」「できない」を確認する。
あ~面倒くさ。