質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2178閲覧

Android Studioで列幅が違う表形式のスクロール可能画面を作りたい

yamchi

総合スコア1

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/08/06 04:53

前提・実現したいこと

Android StudioでEXCELのようなアプリを作成したいと考えています。
そこでGridViewを使ってセルを作成しようとしています。ここで重要な事は設定操作によってセル幅を変更する事です。具体的には、列数は5つで、設定画面でこれらの幅の割合を指定すればテーブル表示画面を表示すると、この割合に沿った幅を持つ列で構成されるテーブルが表イメージ説明にしたいのです。(高さも設定値ですが全行同じで構わないです)
GridViewをActivity_Main.xmlに、カスタムセルをrecord_cell.xml、AdapterをRecordAdapter.java、GridViewの表示をMain_Process.java(MainActivity.javaから呼ばれる)に書きました。
そして、Adapterの中で、AbsListView.LayoutParamsを使用してそれぞれのカラムの幅を設定しますがカラム内のEditTextの幅は変わるものの列は5等分されているようです。(下図)
列幅も設定された割合にして下図の上部にあるメニュー/確認事項/結果/入力者/特記事項(LnearLayoutで並べた)のようにしたいのですが、どうすればよいでしょうか?

なお、AbsListView.LayoutParamsで使用されているsWidthは直前の画面で取得したスクリーン幅です。

発生している問題・エラーメッセージ

列幅は常に全て画面の1/5になってしまいます。
セル内のEditBoxのサイズは変えられますがスペースが出来るだけになります。
画像の1~10を表示している部分です。
その上のメニュー~特記事項のように表示したいのです。(これはLinearLayout)

該当のソースコード

XLM

1Main_procell.xml 2 3<LinearLayout 4 xmlns:android="http://schemas.android.com/apk/res/android" 567 8 // 記録表示他 9 <GridView 10 android:id="@+id/recordLayoutRec" 11 android:layout_width="match_parent" 12 android:layout_height="0dp" 13 android:layout_weight="1" 14 android:layout_marginTop="1dp" 15 android:layout_marginLeft="1dp" 16 android:horizontalSpacing="1dp" 17 android:numColumns="5" 18 android:stretchMode="columnWidth"></GridView> 192021 </LinearLayout>

XML

1record_cell.xml 2 3<?xml version="1.0" encoding="utf-8"?> 4<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent"> 7 8 <EditText 9 android:id="@+id/recordText" 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" 12 android:textSize="@dimen/textSize" 13 android:background="@color/whiteColor" 14 android:textColor="@color/blackColor" 15 android:textAlignment="viewStart"/> 16 17</LinearLayout>

JAVA

1ProcessActivity.java(関連部分のみ) 2 3 // 記録入力部分のセル設定 4 recordGridView = findViewById(R.id.recordLayoutRec); 5 mRecordAdapter = new RecordAdapter(this, common.bodyDisplay, common.columnRatioOfBody, common.cellHeight, screenWidth); 6 recordGridView.setAdapter(mRecordAdapter); 7 // 上記のscreenWidthは移動前のクラスで獲得したスクリーンの幅

JAVA

1Common.java(関連部分のみ) 2 3public List<String> bodyDisplay = new ArrayList<>(Arrays.asList("1","2","3","4","5","6","7","8","9","10")); 4public List<Integer> columnRatioOfBody = new ArrayList<>(Arrays.asList(20,25,7,13,35,20,25,7,13,35)); 5public int cellHeight = 80;

JAVA

1RecordAdapter.java 2 3public class RecordAdapter extends BaseAdapter { 4 private List<String> recordArray = new ArrayList(); 5 private Context mContext; 6 private LayoutInflater mLayoutInflater; 7 private List<String> bDisp = new ArrayList<>(); 8 private List<Integer> bRatio = new ArrayList<>(); 9 private Integer cHeight; 10 private Integer sWidth; 11 protected int lastPosition = -1; 12 13 //カスタムセルを拡張したらここでWidgetを定義 14 private static class ViewHolder { 15 public EditText recordText; 16 } 17 18 public RecordAdapter(Context context, List<String > bodyDisplay, List<Integer> columnRatioOfBody, Integer cellHeight, Integer screenWidth) { 19 mContext = context; 20 mLayoutInflater = LayoutInflater.from(mContext); 21 bDisp = bodyDisplay; 22 bRatio = columnRatioOfBody; 23 cHeight = cellHeight; 24 sWidth = screenWidth; 25 } 26 27 @Override 28 public int getCount() { 29 return bDisp.size(); 30 } 31 32 @Override 33 public View getView(int position, View convertView, ViewGroup parent) { 34 if (getCount()>1){ 35 if(lastPosition == 0 && position == 0 && convertView != null){ 36 return convertView; 37 } 38 } 39 lastPosition = position; 40 41 RecordAdapter.ViewHolder holder; 42 if (convertView == null) { 43 convertView = mLayoutInflater.inflate(R.layout.record_cell, null); 44 holder = new ViewHolder(); 45 holder.recordText = convertView.findViewById(R.id.recordText); 46 convertView.setTag(holder); 47 } else { 48 holder = (RecordAdapter.ViewHolder) convertView.getTag(); 49 } 50 51 //セルのサイズを指定 52 53 float dp = mContext.getResources().getDisplayMetrics().density; 54 AbsListView.LayoutParams params = new AbsListView.LayoutParams(sWidth / 100 * bRatio.get(position) - 1, cHeight - 1); 55 convertView.setLayoutParams(params); 56 57 //position部分のみ表示させる 58 holder.recordText.setText(bDisp.get(position)); 59 60// convertView.setBackgroundColor(Color.WHITE); 61 62 return convertView; 63 64 } 65 @Override 66 public long getItemId(int position) { 67 return 0; 68 } 69 70 @Override 71 public Object getItem(int position) { 72 return null; 73 } 74}

試したこと

record_cell.xmlのandroid:layout_widthをwrap_contentにしたり、GridViewのstretchModeをnone等変えてみましたがダメでした。

補足情報(FW/ツールのバージョンなど)

Android Studioのバージョンは4.1です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/08/07 02:24

> 列幅は常に全て画面の1/5になってしまいます そもそも GridView は(それぞれの中身がどうあれ) 全てを同じ大きさで並べるものではありませんか?
yamchi

2021/08/07 02:58

早速のご連絡ありがとうございます。 なるほど。ではどのwidgetを使用すれば良いのでしょうか?(GridViewにこだわっているわけではありません) 作りたいのは、住所録のようなアプリなので、氏名の列と住所の列が同じでは困ります。また、縦に並べるのは画面上に空白の部分増えるので非効率です。 スクロールする必要があるのと、セルの個数が固定ではないので、セルの一つ一つにIDを付ける方法は無理です。 良いサンプルがあれば教えて下さい。
jimbe

2021/08/07 03:13 編集

> 作りたいのは、住所録のようなアプリ 「のような」と言われると具体性が無くなりますが…。 Excel のように自在に横に並べて(さらに縦にも並べて)使える View は標準では無いように思います。 > その上のメニュー~特記事項のように表示したいのです。(これはLinearLayout) とされていますので、この時点で(列方向の?)「セルの個数が固定ではない」という仕様は必要ではないのではありませんか。 (各行のレイアウトを 1 からコードで組み立てるようにすれば幾らでも可変にはなると思いますが。) "行"を縦に並べてスクロールというのは、ListView なり RecyclerView なりで出来ると思います。
yamchi

2021/08/07 03:55

ご回答ありがとうございます。 「住所録のような」と書きましたが、実際には記録管理アプリで、1行の中に管理作業内容と結果(〇、×)を入れる必要があるので例の幅を変えたいのです。なお、列方向のセルの個数(いわゆる列数)は5で固定です。但し、設定によって4にする場合もあるので、その場合は不要な列の幅を0にしようと考えています。なお、行数は、設定によって制限なく変えられます。 「各行のレイアウトを 1 からコードで組み立てるようにすれば幾らでも可変にはなる」との事ですが、これを示しているサンプルはどこかにないでしょうか?
jimbe

2021/08/07 04:16

「android レイアウト コード」といった風で検索されては如何でしょう。 ただ、「列方向のセルの個数(いわゆる列数)は5で固定です。但し、設定によって4にする場合もあるので…」ということであれば、(EXCEL 風にというほど大事にならずに)普通に列 5 のレイアウトと列 4 のレイアウトを準備しておいて行毎に切り替えるとかでも済みそうですが。
yamchi

2021/08/07 04:26

ありがとうございます。 各行のレイアウトを 1 からコードで組み立てる、に挑戦してみます。
guest

回答1

0

ベストアンサー

方向性を決められて作業に入られたようですが、違う方向で試しに任意に列幅を変えるようなモノを作ってみました。
画面下部の各値を変えるとリアルタイムに列幅が変わります。

(コードとレイアウトを直接書くと1万文字を超えたため、GitHub に入れました。)

MainActivity.java

https://github.com/Jimbe-github/teratail-q353025/tree/ba29de306073fd23b7a6a4f8fbdfa5967999738a/app/src/main/java/com/teratail/q353025

レイアウト:
activity_main.xml, record_layout.xml

https://github.com/Jimbe-github/teratail-q353025/tree/ba29de306073fd23b7a6a4f8fbdfa5967999738a/app/src/main/res/layout

投稿2021/08/07 11:41

編集2021/08/08 17:44
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamchi

2021/08/07 12:25

サンプル作成ありがとうございました。 プロジェクトを作成し動作させたところ期待通りの表示でした。 まだ、中身を理解していないのでこれから勉強ですが、少し気になったのは「そ」と「ほ」と「ろ」が表示されないことぐらいです。(セル幅の変更をしたら映らなくなった?)
jimbe

2021/08/07 13:07

あ、すいません。説明が抜けていました。 列数が 4 になる状況が分からなかったので、id が 3 の倍数の行では最後の列を非表示にすることで「それっぽい」ことにしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問