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

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

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

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

Android

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

button

HTMLで用いる<button>タグです。

Android Studio

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

Q&A

解決済

2回答

441閲覧

ボタンにテキストを設定したときにほかのビューとの間に空白ができてしまう

salt111

総合スコア17

Java

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

Android

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

button

HTMLで用いる<button>タグです。

Android Studio

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

0グッド

0クリップ

投稿2024/05/13 19:08

編集2024/05/14 09:25

実現したいこと

カスタムボタンの完璧な配置

前提

android studio,javaで開発しています

発生している問題

カスタムボタンをグリッドレイアウトに動的にたくさん配置しているのですが、ボタンにテキストを設定すると、ボタンとボタンの間に不自然な隙間ができます。これをなくしたいです。

問題の画像

イメージ説明
画像では誇張してテキストを大きくしていますが、10dp程度でも、数ピクセルの隙間ができてしまいます。
もっと小さくすると隙間が発生しないですが、視認性が落ちるので困っています。

試したこと

ボタンのテキストを無くせば理想の配置になります。
イメージ説明

テキストの大きさによって空白の大きさも変わります。
マージン関連の属性のせいなのかと思い、すべて変更し確認してみましたが効果はありませんでした。
ボタンの大きさを大きくすると空白が生じ始める最小のテキストの大きさも大きくなります。

ソースコード 追記

java

1package com.example.myapplication; 2 3import android.content.Context; 4import android.graphics.Color; 5import android.graphics.drawable.GradientDrawable; 6import android.os.Bundle; 7import android.view.MotionEvent; 8 9import androidx.appcompat.app.AppCompatActivity; 10import androidx.appcompat.widget.AppCompatButton; 11import androidx.constraintlayout.widget.ConstraintLayout; 12import androidx.gridlayout.widget.GridLayout; 13 14public class MainActivity extends AppCompatActivity { 15@Override 16protected void onCreate(Bundle savedInstanceState) { 17super.onCreate(savedInstanceState); 18setContentView(R.layout.main); 19ConstraintLayout constraintLayout = findViewById(R.id.constraint); 20 21constraintLayout.post(() -> { 22GridLayout gridLayout = findViewById(R.id.grid); 23 24int column = gridLayout.getColumnCount(); 25int row = gridLayout.getRowCount(); 26 27int width = constraintLayout.getWidth() / column; 28int height = constraintLayout.getHeight() / row; 29int btnSize = 150; 30int widthMargin = (width-btnSize) / 2; 31int heightMargin = (height-btnSize) / 2; 32 33String[] note = {"あ", "あ", "", "あ", "あ"}; 34for (int i = 0; i < column * row; i++) { 35GridLayout.LayoutParams params = new GridLayout.LayoutParams(); 36params.width = params.height = btnSize; 37params.columnSpec = GridLayout.spec(i % column, 1); 38params.rowSpec = GridLayout.spec(i / column, 1); 39 40params.setMargins(widthMargin, heightMargin, widthMargin, heightMargin); 41 42CircleButton button = new CircleButton(this,Color.WHITE, btnSize); 43button.setLayoutParams(params); 44button.setId(i); 45button.setText(i % column < note.length ? note[i % column] : null); 46button.setOnClickListener(v -> { 47 48}); 49 50gridLayout.addView(button); 51} 52}); 53} 54 55public static class CircleButton extends AppCompatButton { 56public CircleButton(Context context,int color, int size) { 57super(context); 58GradientDrawable drawable = new GradientDrawable(); 59drawable.setShape(GradientDrawable.OVAL); 60drawable.setColor(color); 61setBackground(drawable); 62 63setPadding(0, 0, 0, 0); 64setMinWidth(size); 65setMinHeight(size); 66setTextSize(100); 67} 68 69@Override 70public boolean onTouchEvent(MotionEvent event) { 71int centerX = getWidth() / 2; 72int centerY = getHeight() / 2; 73int radius = getWidth() / 2; 74 75if (event.getActionMasked() == MotionEvent.ACTION_DOWN && (float) Math.sqrt(Math.pow(event.getX() - centerX, 2) + Math.pow(event.getY() - centerY, 2)) > radius) { 76if (event.getAction() == MotionEvent.ACTION_UP) performClick(); 77return false; 78} 79 80return super.onTouchEvent(event); 81} 82 83@Override 84public boolean performClick() { 85return super.performClick(); 86} 87} 88} 89

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3xmlns:app="http://schemas.android.com/apk/res-auto" 4android:id="@+id/constraint" 5android:layout_width="match_parent" 6android:layout_height="match_parent"> 7 8<androidx.gridlayout.widget.GridLayout 9android:id="@+id/grid" 10android:layout_width="0dp" 11android:layout_height="0dp" 12android:background="#787878" 13app:columnCount="5" 14app:layout_constraintBottom_toBottomOf="parent" 15app:layout_constraintEnd_toEndOf="parent" 16app:layout_constraintStart_toStartOf="parent" 17app:layout_constraintTop_toTopOf="parent" 18app:rowCount="5"> 19 20</androidx.gridlayout.widget.GridLayout> 21</androidx.constraintlayout.widget.ConstraintLayout>

追加で分かったことがあるので記しておきます。
・ボタンのテキストに何も記述しない列がないと起こらない
・テキストが英文字であると起こらない(かな、カナであると起こる)
・英文字である列とかなである列が混在していても起こる
どうやらテキストが関係していそうです。

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

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

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

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

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

jimbe

2024/05/13 20:22

コピペして動作させれば画像のようになることが確認出来る最小の一連のコード・レイアウトをご提示頂けますでしょうか。 部分々々では再現できなかったり、提示されていない部分が関係している可能性も捨てきれません。 また開発環境・動作環境が関わるかもしれませんので、各種バージョンやエミュレータ・実機の設定等々、出来る限り情報を添付頂けると助かると思います。
salt111

2024/05/14 09:25

長くなりましたので質問文に追記しておきました。ご確認ください。
jimbe

2024/05/14 10:10 編集

ありがとうございます。後ほど試してみます。 45行目のsetText をした場合としなかった場合で各ボタンが同じ位置にあれば良いということであっていますか。
salt111

2024/05/14 10:29

はい。その通りです。
guest

回答2

0

自己解決

カナ、かなの違いで起こるようだったので、カスタムフォントを作成し、文字の幅と高さをすべて統一すると解決しました。
また、空白とかなの違いのみだとそこまでせずとも全角のスペースを入れると解決することを確認しました。

投稿2024/06/16 10:28

salt111

総合スコア17

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

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

0

ご提示頂いたコードとレイアウトを新規作成したプロジェクトの MainActivity.java と activity_main.xml に張り付け、いつも使っている Pixel 6 API 30 のエミュレータで setText をコメントにした/しない場合の実行時画面をキャプチャして "ペイント" でそれぞれを 25% に縮小後並べました。
実行時画面比較
赤線は並べた後に書き込んだものです。
目立った違いは無さそうです。


ついでに(?) GridLayout へのボタンの設定は row/column とも alignment=CENTER, weight=1f とすることで各枠を GridLayout の幅/高さを等分に分けた大きさにした上でボタンを中央に出来ますので、マージンを計算・設定しなくて済むのではないでしょうか。(実際の大きさが決まるのを待つ必要が無くなるので post もせずに済みますし。)

java

1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_main); 5 6 GridLayout gridLayout = findViewById(R.id.grid); 7 8 int column = gridLayout.getColumnCount(); 9 int row = gridLayout.getRowCount(); 10 11 int btnSize = 150; 12 13 String[] note = {"あ", "あ", "", "あ", "あ"}; 14 for (int i = 0; i < column * row; i++) { 15 GridLayout.LayoutParams params = new GridLayout.LayoutParams(); 16 params.width = params.height = btnSize; 17 params.columnSpec = GridLayout.spec(i % column, GridLayout.CENTER, 1f); 18 params.rowSpec = GridLayout.spec(i / column, GridLayout.CENTER, 1f); 19 20 CircleButton button = new CircleButton(this, Color.WHITE, btnSize); 21 button.setLayoutParams(params); 22 button.setId(View.generateViewId()); 23 button.setText(i % column < note.length ? note[i % column] : null); 24 button.setOnClickListener(v -> { 25 26 }); 27 28 gridLayout.addView(button); 29 } 30 }

投稿2024/05/14 11:15

編集2024/05/14 14:45
jimbe

総合スコア13045

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

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

salt111

2024/06/16 10:25

このビューの裏にほかのビューを重ねたかったので、1pxのずれも妥協したくなかった結果そのコードになりました。w なぜ僕の環境でしか起こらなかったのかは謎ですね、、
jimbe

2024/06/16 11:09

>このビューの裏にほかのビューを重ねたかったので "このビュー" というのはボタンを並べているパネルのことでしょうか。 計算の誤差が発生するような大きさ関係ならアプリで計算してもレイアウトマネージャが計算しても同じかと思いますが…まあココは掘る所じゃないですね。 >なぜ僕の環境でしか起こらなかったのかは謎ですね、、 それを確認する為もあって質問へのコメントに >また開発環境・動作環境が関わるかもしれませんので、各種バージョンやエミュレータ・実機の設定等々、出来る限り情報を添付頂けると と書かせて頂いたのですけども^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問