前回、大きな進展があった。今回はそれをより綺麗な形にする。

前回こんな感じのUIを作成する事に成功した。しかし、まだ凸凹だし、中身が空っぽだからタッチに反応もしない。「ただの」ボタンだ。

TableLayout:格子状の配置

はっきり言って今のボタン配置は論外だ。超横長で4つ以上は画面外に消えてしまう。電卓のように綺麗な格子状に配列しなくては。

そういう時には「GridLayout」が役に立つらしい。と思ったらそれはもう古く、今は「TableLayout」が良いらしい。という訳で、まずボタンを追加する部分のレイアウトを「TableLayout」にする。レイアウト設定画面の「コンポーネント・ツリー」に要素をドラッグして・・・

画面左上の粒みたいなのが「TableLayout」だ。現在は中身が空だから超小さくなってしまっているが、ボタンが入ればきちんと大きくなる。大きさの最大値を決めておくか最初から大きさを固定しておかないと大きくなりすぎてしまう事も有るから要注意だ。ここに配置したい行数分「TableRow」を追加していく。今回は4列だからこんな感じだ。

そして・・・ちょっと待て、これってまさか列指定ではなく行指定なのか?だとしたら非常にまずい。

列は横の数、行は縦の数だ。ボタンは横に4つずつ並べようとしていたから列数は4で確定だが、何行になるかは分からない!また記述できない問題かよ!

一応前回やった「inflate」を使うことは出来るが

なんと言うか、内部が少々面倒な事になってしまう。4列作ってからそれを1段ずつセットしていったら・・・

//一列分(4つ)
        val buttonRow = findViewById<TableRow>(R.id.button_row)
        //1buttonRowにつき4つのButtonを設定する
        for (i in 0 until line - 1) {
            for (j in 0 until 3) {
                buttonRow.addView(buttonPack[j + i * 4])
            }
            buttonXml.addView(buttonRow, 1)
        }

駄目か。多分現在画面に表示されているXMLファイルにしかアクセス出来ないのだろうな。どうするか。

・・・不味い、それっぽく弄ってたら中途半端に動作してしまった。よく分からないがそれなりに動くのはプログラム的にとても不味い。

・・・うまく動いてしまったよ・・・いや、なんとなく分かるんだがこれで良かったのか・・・?

いや、駄目だ。4で割り切れない数を入力するとエラーが発生してしまう。多分端数の行のボタンがうまく入力されていないのだろう。かといってその部分を削ると全ての端数ボタンが無くなってしまうし・・・そうだ、ここにこれを追加して・・・(省略してしまったがここに来るまで30分~1時間位かかった)

for (j in 0 until 4) {
                buttonrow.addView(buttonPack[j + i * 4])
                //あまりが発生した時の最終行設定
                if (i == line - 1 && inputNumber % 4 in 1..3 && inputNumber % 4 == j + 1) {
                    break
                }

これでようやく、

そろそろ冗談じゃなくなってきた。今深夜回ったよ。ぼくチンできまちぇんと言いたいのか?画面割られてぇか?

落ち着こう。まさか正常に動作しているのが開発機だけだとは思わなかった。Androidには画面のサイズによってViewの大きさが自動で変わる仕組みがあるのだが、どうやら正常に機能していないみたいだ。そのせいで画面の大きさが違う端末で実行するとこうなってしまうみたいだ。一応手動で大きさを変更することも出来るが、それだと問題の解決には至らない。

今現在この部分の画面構成に関わっているのは

  • button_row.xml
  • activity_confidentialのbutton_table_layout
  • activity_confidentialのscrollView

この3つだ。だが、ここのパラメータをいじってもどうにもならない。恐らくプログラムでボタンを追加した弊害だろう。XML上で管理されていないからその部分の大きさの制御が出来ないのだろう。

はっきり言って最悪だ!!

打つ手が全く思いつかない。どうして良いかまるで分からない。まさかここまで来てこんなくだらない事が原因でやり直すのか?はっきり言ってくだらないだろ、ボタンの大きさぐらい自動で変えろよ。それぐらいうまくやれよ。どうすれば良いんだ?

勿論プログラム上からボタンの大きさを変えることも出来るが、それだと機種別に全て手動で登録することになる。なんとしても自動で調整する方法を探すぞ。

しばらくやってみたが最悪、何をやってもダメダメダメ、まあプログラムって言うのはたいていそういうもんだが。


                    LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)

これを入れるとうまくいくらしいが

まさかのダンマリ、いい態度だ。

あと一歩なのにうまくいかない、本当にイライラするよ。

原因はわかっている。通常はまずレイアウトの大きさを確認してから適切な大きさを計算してボタンが配置される。でも今回はまずボタンが入って(正確にはまだ大きさが設定されていないレイアウトの中に入って)それに合わせてレイアウトの大きさが決定しているから、サイズ調整が上手くいかないんだ。ボタンがレイアウトに合わせるんじゃなくってレイアウトがボタンに合わせて決まってしまっている。つまりこの方法ではどうやっても手詰まりって事だ。

さようなら、最悪な午後。後日知り合いにもっと良い方法を聞いて1からやり直す。

今回はここまでだ。だが絶対に解決してみせる。それでは次回まで。

この記事が気に入ったら
フォローしよう

最新情報をお届けします

おすすめの記事