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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

0回答

2619閲覧

【AndroidStudio:Kotlin】TableRowの動的な追加削除を実装したい。

furufurufuru

総合スコア0

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/06/07 08:55

前提・実現したいこと

AndroidStudioにてKotlinでアプリ開発を行っています。
実装したい内容としてはボタンを押すと得点が追加され、RETURNボタンを押すと最新の得点が減算される処理を実装したいです。

■実装イメージ
①初期表示
得点:0
②「ポイント」ボタン押下
得点:01
③「ポイント」ボタン押下
得点:012
④「RETURN」ボタン押下
得点:01
⑤「RETURN」ボタン押下
得点:0
⑥「ポイント」ボタン押下
得点:01

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

困っているのは上記処理を行うと、⑤で「ポイント」ボタンを押下すると”得点:01”が
表示されると思っていたのですが、以下の処理で値が格納されないのか"1"が表示されません。
val tr1 = vg1.getChildAt(serve_count-1) as TableRow
((tr1.getChildAt(0)) as TextView).setText(player1_point.toString())

該当のソースコード

■ソースのイメージ
②③「ポイント」ボタン押下
//Layoutに配置したTableRow(player1.table)をviewに設定
val vg1 = findViewById<View>(R.id.player1_table) as ViewGroup

//vg1にレイアウトxml(score_table_1)のtableを追加
getLayoutInflater().inflate(R.layout.score_table_1, vg1)

//vg1の最後のカラム(serve_count-1)をtr1に取得し、得点をtextviewとして追記する。
val tr1 = vg1.getChildAt(serve_count-1) as TableRow
((tr1.getChildAt(0)) as TextView).setText(player1_point.toString())
tr1.setId(serve_count);

④⑤「RETURN」ボタン押下
//Layoutに配置したTableRow(player1.table)をviewに設定
val vg1 = findViewById<View>(R.id.player1_table) as ViewGroup

 //TableRowの一番後ろのId(serve_count)を指定してtr1に格納
val tr1 = vg1.getChildAt(serve_count) as TableRow;

 //上記で取得したtr1を削除
tr1.setVisibility(View.GONE);

⑥「ポイント」ボタン押下
//Layoutに配置したTableRow(player1.table)をviewに設定
val vg1 = findViewById<View>(R.id.player1_table) as ViewGroup

//vg1にレイアウトxml(score_table_1)のtableを追加
getLayoutInflater().inflate(R.layout.score_table_1, vg1)

//vg1の最後のカラム(serve_count-1)をtr1に取得し、得点をtextviewとして追記する。
val tr1 = vg1.getChildAt(serve_count-1) as TableRow
((tr1.getChildAt(0)) as TextView).setText(player1_point.toString())
tr1.setId(serve_count);

試したこと

tr1.setId(serve_count);にてTableRowのカラムにIdが付与されているか確認するために
以下の記述にてIdを出力しているのですが、想定したIdは出力されているようです。
val scoreid1:Int = tr1.getId()
val scoreid_text1 : String = scoreid1.toString()

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

いまいち、inflateで追加されたtableRowのIdの振られ方がよく分かりません。
あとは、tr1.setVisibility(View.GONE);にてviewを削除した際にviewのIdがどうなるのかもよく分かりません。
なので、inflateにて追加したviewにtr1.setId(serve_count);にてIdを明示的に指定したつもりなのですが
【予想】
⑥「ポイント」ボタン押下
得点:01
【実態】
⑥「ポイント」ボタン押下
得点:0x
(xはxmlで指定した初期値)

⑦「ポイント」ボタン押下
得点:0xx
(xはxmlで指定した初期値)

⑧「ポイント」ボタン押下
得点:03xx
(xはxmlで指定した初期値)

この⑦にて3が最初のほうに入ってくるのも分かりません。
実装したい内容が実現できれば他の方法も考えてみたのですが、他にいい方法があるのでしょうか。

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

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

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

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

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

hoshi-takanori

2020/06/07 10:39

ソースの「イメージ」ではなく、ソースコードそのものを貼ってください。また、layout xml もお願いします。
furufurufuru

2020/06/07 11:19

失礼しました。 ■singles_score.kt class singles_score : AppCompatActivity() { //変数の定義 var player1_point: Int = 0 var player2_point: Int = 0 var serve_count_MAX: Int = 0 var serve_count: Int = 0 var return_count: Int = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_singles_score) //受け取った変数を入れる val Serve = intent.getIntExtra("SERVE",0); //Serveの初期画面を設定 if(Serve == 0){ val serve : String = "R" player2_serve.setText(serve.toString()) Singles_Serve.setImageResource(R.drawable.coat1); }else{ val serve : String = "R" player1_serve.setText(serve.toString()) Singles_Serve.setImageResource(R.drawable.coat2); } //playerのポイントのインスタンスを取得 val player1_game1 = findViewById<TextView>(R.id.player1_game1) val player2_game1 = findViewById<TextView>(R.id.player2_game1) //player1のbuttonを取得 val player1_button = findViewById<Button>(R.id.player1_button) //Buttonの処理を追記 player1_button.setOnClickListener { //player1のポイントを1点追加 player1_point++ //player1の得点を反映 player1_game1.setText(player1_point.toString()) //サーブの画像チェンジ if (player1_point % 2 == 0) { Singles_Serve.setImageResource(R.drawable.coat1); } else { Singles_Serve.setImageResource(R.drawable.coat3); } //スコアボードの処理 val vg1 = findViewById<View>(R.id.player1_table) as ViewGroup val vg2 = findViewById<View>(R.id.player2_table) as ViewGroup // if(serve_count == serve_count_MAX ){ //ポイントの合計値に1を追加 serve_count++ serve_count_MAX++ //player1_tableにtextviewを追加 getLayoutInflater().inflate(R.layout.score_table_1, vg1) getLayoutInflater().inflate(R.layout.score_table_0, vg2) //player1のスコアを追加テキストに追記 val tr1 = vg1.getChildAt(serve_count-1) as TableRow ((tr1.getChildAt(0)) as TextView).setText(player1_point.toString()) tr1.setId(serve_count); //player2のスコアを追加テキストに追記 val tr2 = vg2.getChildAt(serve_count-1) as TableRow ((tr2.getChildAt(0)) as TextView).setText(player1_point.toString()) tr2.setId(serve_count); val scoreid1:Int = tr1.getId() val scoreid_text1 : String = scoreid1.toString() val scoreid2:Int = tr2.getId() val scoreid_text2 : String = scoreid2.toString() player1_game2.setText(serve_count_MAX.toString()) player1_game3.setText(serve_count.toString()) player2_game2.setText(scoreid_text1.toString()) player2_game3.setText(scoreid_text2.toString()) /* }else{ //ポイントの合計値に1を追加 serve_count++ val tr1 = vg1.getChildAt(serve_count-1) as TableRow; ((tr1.getChildAt(0)) as TextView).setText(player1_point.toString()) val tr2 = vg2.getChildAt(serve_count-1) as TableRow; ((tr2.getChildAt(0)) as TextView).setText(player1_point.toString()) val scoreid1:Int = tr1.getId() val scoreid_text1 : String = scoreid1.toString() val scoreid2:Int = tr2.getId() val scoreid_text2 : String = scoreid2.toString() player1_game2.setText(serve_count_MAX.toString()) player1_game3.setText(serve_count.toString()) player2_game2.setText(scoreid_text1.toString()) player2_game3.setText(scoreid_text2.toString()) } */ //ボタンが押されたらスコアの一番後ろを表示する、 point_scroll.post(Runnable { point_scroll.fullScroll(View.FOCUS_RIGHT) }) //test /*val tr1 = vg1.getChildAt(serve_count_MAX-1) as TableRow; val tr2 = vg2.getChildAt(serve_count_MAX-1) as TableRow; val scoreid1:Int = tr1.getId() val scoreid_text1 : String = scoreid1.toString() val scoreid2:Int = tr2.getId() val scoreid_text2 : String = scoreid2.toString() player1_game2.setText(serve_count_MAX.toString()) player1_game3.setText(serve_count.toString()) player2_game2.setText(scoreid_text1.toString()) player2_game3.setText(scoreid_text2.toString()) */ } //returnのbuttonを取得 val return_button = findViewById<Button>(R.id.return_button) //Buttonの処理を追記 return_button.setOnClickListener { //serve_count_MAX-- if(serve_count > 0) { return_count++ //Player1のスコアを減らす player1_point-- //if(serve_count + return_count-1 == serve_count_MAX ) { //スコアを一つ減らす serve_count-- val vg1 = findViewById<View>(R.id.player1_table) as ViewGroup val tr1 = vg1.getChildAt(serve_count) as TableRow; ((tr1.getChildAt(0)) as TextView).setText("".toString()) //tr1.setBackgroundResource(R.drawable.return); val vg2 = findViewById<View>(R.id.player2_table) as ViewGroup val tr2 = vg2.getChildAt(serve_count) as TableRow; //((tr2.getChildAt(0)) as TextView).setText("".toString()) tr1.setVisibility(View.GONE); //tr2.setVisibility(View.GONE); //tr1.setVisibility(View.INVISIBLE); val scoreid1:Int = tr1.getId() val scoreid_text1 : String = scoreid1.toString() val scoreid2:Int = tr2.getId() val scoreid_text2 : String = scoreid2.toString() player1_game2.setText(serve_count_MAX.toString()) player1_game3.setText(serve_count.toString()) player2_game2.setText(scoreid_text1.toString()) player2_game3.setText(scoreid_text2.toString()) //ボタンが押されたらスコアの一番後ろを表示する、 point_scroll.post(Runnable { point_scroll.fullScroll(View.FOCUS_RIGHT) }) player1_game1.setText(player1_point.toString()) player2_game1.setText(player2_point.toString()) } //スコアのビューを削除する //score_scroll.getParent().removeView(score_scroll) //ボタンが押されたらスコアの一番後ろを表示する、 //score_scroll.post(Runnable { score_scroll.fullScroll(View.FOCUS_RIGHT) }) } } ■score_table_1.xml <?xml version="1.0" encoding="utf-8"?> <TableRow android:layout_width="wrap_content" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/line" android:padding="5dp" android:text="9" android:textColor="#FFFFFF" /> </TableRow>
hoshi-takanori

2020/06/07 20:42 編集

ソース拝見しましたが、いまいち何がしたいのか分かりません。(これは何のスコアなのでしょうか?) まず、ビューの id の使い方を誤解されているような印象を受けます。基本的に id は一つの layout ファイルの中の子ビューを指定するために用いるものです。今回のコードでは (すでにお使いの) getChildAt で充分なのでは。 (動的に生成したビューに id を振ることもできなくはありませんが、他の id とかぶらないように generateViewId メソッドを使用すべきですが、生成された id の値に規則性を期待すべきではないので、id よりも tag の方が使いやすいと思います。) また、表示するデータを動的に増減したいのであれば、TableLayout よりも ListView や RecyclerView の利用を検討すべきかと思います。
furufurufuru

2020/06/08 14:39

コメントありがとうございます。 得点はスポーツのポイントで1点ずつ加算されていきます。 このような感じで増えていくことを考えています。 player1|0|1|2|3|_|_|_|4|5|… Player2|0|_|_|_|1|2|3|_|_|… 得点の追加間違えがあった際に最後に追加した得点を削除したいです。 ”基本的に id は一つの layout ファイルの中の子ビューを指定するために用いるものです。” 確かに、idの考え方が間違っているようです。生成されたidに規則性を求めていました。 TableLayoutの中にtextViewを動的に追加、削除するイメージでした。 player1|0|1|2|3|_|_|_|4|5|… 野球のスコアボードのように得点を白い枠で囲みたかったので各textViewにxmlにて白い枠線を指定すればと思ったのですが、確かに可変のリストを扱うのであれば、ListViewがいいのかと思いました。 (可変なのでArrayListでしょうか・・・) ArrayListを配列として得点の追加削除はできそうですが、それをどのように動的に画面に描画するのかがまだよく分かっていないので調べてみようと思います。 (毎回Layoutを削除してLayoutを追加し、for文でaddViewするイメージでしょうか・・・)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問