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

android OS & iPadOS の記録。

基礎。レイアウトとフラグメント、別アクティビティー。小規模ならレイアウトオンリー。

2021-10-11 12:16:59 | Android studio 日記

PCのウィンドウのように種類別に開いて作業をしたい。調べるとなんか、フラグメント利用や別のアクティビティーを開く文献が最初に目に付く。大規模なプロジェクト、大人数での開発では、その通りだわ。
だけど、小規模単独開発にはどうなの?
共通データには、どこからでもアクセスできた方が楽。構造体データとしてまとめておけば、改変するのもある程度は対応できる。大規模多人数開発ではデータの流れを絞り通過点を固定した方が安全安心、問題部分の発見も早いのでプログラムの性質で使い分けだ。

では、小規模開発でページレイアウトを切り替えて表示を変えるにはどうするか。

activity_main.xml で3枚のページを作る。順番に置かれるみたいなので、一枚目が下、三枚目が一番上になる。


    <FrameLayout ◎一枚目◎
        android:id="@+id/frame_Layout"
        …>
        <ImageView
            android:id="@+id/image_view1"
            … />
    </FrameLayout>

    <RelativeLayout ◎二枚目◎
        android:id="@+id/relative_layout1"
       …>
        <ImageView
            android:id="@+id/image_view2"
            … />
    </RelativeLayout>

    <RelativeLayout ◎三枚目◎
        android:id="@+id/relative_layout2"
        …>

        <ImageView
            android:id="@+id/image_view3"
            … />

    </RelativeLayout>

 

プログラムで
    public void layoutInvisible() {
        RelativeLayout layout = (RelativeLayout)findViewById( R.id.relative_layout1 );
        layout.setVisibility(View.GONE);
    }
か、
    public void layoutVisible() {
        RelativeLayout layout = (RelativeLayout)findViewById( R.id.relative_layout1 );
        layout.setVisibility(View.VISIBLE);
    }
で、ページレイアウト単位で非表示、表示が切り替えられる。表示状態か調べるには、

    public boolean isLayoutVisible() {
        RelativeLayout layout = (RelativeLayout)findViewById( R.id.relative_layout1 );
        return  ( layout.getVisibility() == View.VISIBLE );
    }
戻り値がtrueなら表示状態。
(ウィジェットの表示状態はページレイアウトの表示設定で一緒には変更されないので個々に調べるとページは非表示だけど、ウィジェットは、View.VISIBLE 状態になっている。だから注意が必要。それと、View.GONEは存在しないものとして扱われるモード。ページ上のウィジェットも存在しない領域へ…)

タッチイベントでサブレイアウトが表示されているか調べて処理を振り分ける。

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if ( isLayoutVisible() ) {
            ; // サブページレイアウトが開いてる時のタッチ処理を書く
        } else {
            if ( imageOnTouchEvent(event) ) // メインレイアウトのタッチ処理
                return true;
        }

        return super.onTouchEvent(event);
    }

    private boolean imageOnTouchEvent(MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:

                break;

            case MotionEvent.ACTION_MOVE:

                return true;

            case MotionEvent.ACTION_UP:

                return true;

        }
        return false;
    }

imageOnTouchEvent(event) この中でページレイアウトを開くアクションが見つかったら、layoutVisible() を実行。そのページを開く、そこでの処理が終わったら、layoutInvisible() でページレイアウトを非表示にしてメインに戻る。

それと、ページレイアウトを切り替えるときアニメーション表示させたい。まだ試験はしてないけどViewSwicter を使えばできそう。それよりも RelativeLayout が非推奨になってるらしい。
ConstraintLayout へ移行処理してるけど、activity_main.xml で、この場所にConstraintLayoutを使います。と、ID を宣言するのは同じ。プログラムでウィジェット(imageView等)を追加するわけだけど、位置や空白を記述するのは直感的で理解しやすい。オブジェクトのセットも流れで行えるので良い感じ。
ただ、使い方が特殊?なのでこちらの望む動作にならない部分が出てくる。ひと手間加えると動き出すので試行錯誤が続く。