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

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

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

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

Android

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

Q&A

解決済

1回答

3567閲覧

TableLayoutが崩れる columnの意味

akamakku

総合スコア191

Java

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

Android

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

0グッド

0クリップ

投稿2016/05/24 08:02

Calenderから月の初めの曜日を取得して、カレンダーの形にButtonを配置しようと思ったのですがうまく行きません。
今月のように月初めの曜日が日曜日の時は大丈夫なのですが、それ以外は行がずれてしまいます。

あと、コードの側ではcolumnを17の設定しているはずなのになぜか39になっているようなんです。
何が起こっているんでしょうか?

Java

1package ***.reminder; 2 3 4import android.os.Bundle; 5import android.support.annotation.IntegerRes; 6import android.support.v4.app.Fragment; 7import android.support.v4.app.FragmentTransaction; 8import android.util.Log; 9import android.view.LayoutInflater; 10import android.view.View; 11import android.view.ViewGroup; 12import android.widget.Button; 13import android.widget.TableLayout; 14import android.widget.TableRow; 15import android.widget.TextView; 16 17import java.util.Calendar; 18 19 20/** 21 * A simple {@link Fragment} subclass. 22 */ 23public class FragmentChooseDay extends Fragment implements View.OnClickListener{ 24 25 private int tableRowId[] = {R.id.row0, R.id.row1, R.id.row2, R.id.row3, R.id.row4, R.id.row5, R.id.row6}; 26 private Button button[]; 27 private TextView textView; 28 private Calendar calendar; 29 private TableRow tableRow; 30 31 public FragmentChooseDay() { 32 // Required empty public constructor 33 } 34 35 36 @Override 37 public View onCreateView(LayoutInflater inflater, ViewGroup container, 38 Bundle savedInstanceState) { 39 // Inflate the layout for this fragment 40 View view = inflater.inflate(R.layout.fragment_choose_day, container, false); 41 42 Bundle bundle = getArguments(); 43 int month = bundle.getInt("month"); 44 int year = bundle.getInt("year"); 45 textView = (TextView)view.findViewById(R.id.textView1); 46 textView.setText(year + "年" + (month+1) + "月"); 47 48 calendar = Calendar.getInstance(); 49 calendar.clear(); 50 calendar.set(year, month, 1); 51 52 int num_day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 53 54 button = new Button[num_day]; 55 56 int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); 57 int num_Row = 1; 58 int d = 1; 59 TableRow.LayoutParams tablerowParams = new TableRow.LayoutParams(); 60 TableRow.LayoutParams tablerowParams2 = new TableRow.LayoutParams(); 61 TableLayout.LayoutParams tablelayoutParams = new TableLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); 62 tablelayoutParams.weight = 1; 63 64 65 for(int i = 0; i < num_day; i++){ 66 button[i] = new Button(getActivity()); 67 button[i].setText(Integer.toString(d++)+"-"+dayOfWeek); 68 button[i].setId(i); 69 button[i].setOnClickListener(this); 70 tablerowParams.column = dayOfWeek; 71 dayOfWeek++; 72 tableRow = (TableRow)view.findViewById(tableRowId[num_Row]); 73 tableRow.setLayoutParams(tablelayoutParams); 74 tableRow.addView(button[i],tablerowParams); 75 tablerowParams2 = (TableRow.LayoutParams) button[i].getLayoutParams(); 76 Log.d("i = " + i, "column = " + tablerowParams2.column); 77 if(dayOfWeek > 7){ 78 dayOfWeek = 1; 79 num_Row++; 80 } 81 } 82 83 return view; 84 } 85 86 @Override 87 public void onClick(View v) { 88 /* int day = v.getId()+1; 89 90 Bundle bundle = new Bundle(); 91 bundle.putInt("day", day); 92 93 Fragment fragment = new FragmentSetTimeAndStr(); 94 fragment.setArguments(bundle); 95 FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); 96 fragmentTransaction.replace(R.id.container, fragment); 97 fragmentTransaction.addToBackStack(null); 98 fragmentTransaction.commit(); 99 */ 100 } 101 102} 103

xml

1<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 tools:context="***.reminder.FragmentChooseDay"> 7 8 <!-- TODO: Update blank fragment layout --> 9 <TextView 10 android:layout_width="wrap_content" 11 android:layout_height="wrap_content" 12 android:textSize="12pt" 13 android:id="@+id/textView1"/> 14 <TextView 15 android:layout_width="wrap_content" 16 android:layout_height="wrap_content" 17 android:textSize="12pt" 18 android:text="Choose Day"/> 19 <TableLayout 20 android:layout_width="match_parent" 21 android:layout_height="match_parent" 22 android:shrinkColumns="3,4,5,6,7,8,9" 23 android:layout_weight="1"> 24 <TableRow 25 android:layout_width="match_parent" 26 android:layout_height="wrap_content" 27 android:id="@+id/row0"> 28 <TextView 29 android:text="Sun" 30 android:layout_column="3"/> 31 <TextView 32 android:text="Mon" 33 android:layout_column="4"/> 34 <TextView 35 android:text="Tue" 36 android:layout_column="5"/> 37 <TextView 38 android:text="Wed" 39 android:layout_column="6"/> 40 <TextView 41 android:text="Thu" 42 android:layout_column="7"/> 43 <TextView 44 android:text="Fri" 45 android:layout_column="8"/> 46 <TextView 47 android:text="Sat 48 " 49 android:layout_column="9"/> 50 </TableRow> 51 <TableRow 52 android:layout_width="match_parent" 53 android:layout_height="match_parent" 54 android:layout_weight="1" 55 android:id="@+id/row1"></TableRow> 56 <TableRow 57 android:layout_width="match_parent" 58 android:layout_height="match_parent" 59 android:layout_weight="1" 60 android:id="@+id/row2"></TableRow> 61 <TableRow 62 android:layout_width="match_parent" 63 android:layout_height="match_parent" 64 android:layout_weight="1" 65 android:id="@+id/row3"></TableRow> 66 <TableRow 67 android:layout_width="match_parent" 68 android:layout_height="match_parent" 69 android:layout_weight="1" 70 android:id="@+id/row4"></TableRow> 71 <TableRow 72 android:layout_width="match_parent" 73 android:layout_height="match_parent" 74 android:layout_weight="1" 75 android:id="@+id/row5"></TableRow> 76 <TableRow 77 android:layout_width="match_parent" 78 android:layout_height="match_parent" 79 android:layout_weight="1" 80 android:id="@+id/row6"></TableRow> 81 82 83 </TableLayout> 84 85</LinearLayout>

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

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

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

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

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

guest

回答1

0

ベストアンサー

回答が付かないようなので調べてみました。
多分、tablerowParamsを使いまわしているのですでに設定したレイアウトを変更してしまっているのが原因と思われます。さらに列番号も間違っていると思います。

レイアウトのサンプルを見ると
日曜日はandroid:layout_column="3"で
土曜日はandroid:layout_column="9"となってますが
これは列0,列1,列2には実際には何らかの列があるということでいいでしょうか?
とりあえずその前提で回答していきます。

例えば2016年6月だと1日が水曜(dayOfWeek = 4)から始まります。
1日作成時
tablerowParams.column = dayOfWeek;
なので1日のボタンには列番号4が設定されます。
この時点ですでに一つ間違いがあり、提示されているレイアウトだと水曜日の場合は列番号6を設定しないといけません。

次に2日作成時は
tablerowParams.column = dayOfWeek;
で5が設定されますが1日のレイアウトも同じインスタンスを参照していますので両方とも5になります。
以上を繰り返してレイアウトが崩れてます。

ループ内の下記部分を

java

1button[i].setOnClickListener(this); 2tablerowParams.column = dayOfWeek; 3dayOfWeek++;

以下のように修正します。

java

1button[i].setOnClickListener(this); 2tablerowParams = new TableRow.LayoutParams(); ←新しいインスタンスを設定するようにする 3tablerowParams.column = dayOfWeek + 2; ← 正しい列番号を設定する 4dayOfWeek++;

そうなるとそもそもループの外で宣言している
TableRow.LayoutParams tablerowParams = new TableRow.LayoutParams();
も不要です。
また、レイアウト側の行にすでにwidth、height、weightを設定しているのにループ内でさらに設定しているのも不要と思います。
それとtableRowを取得するのも1週間に1回でいいので最終的に下記のような感じでどうでしょう・

java

1public View onCreateView(LayoutInflater inflater, ViewGroup container, 2 Bundle savedInstanceState) { 3 // Inflate the layout for this fragment 4 View view = inflater.inflate(R.layout.fragment_choose_day, container, false); 5 6 Bundle bundle = getArguments(); 7 int month = bundle.getInt("month"); 8 int year = bundle.getInt("year"); 9 textView = (TextView) view.findViewById(R.id.textView1); 10 textView.setText(year + "年" + (month + 1) + "月"); 11 12 calendar = Calendar.getInstance(); 13 calendar.clear(); 14 calendar.set(year, month, 1); 15 16 int num_day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 17 18 button = new Button[num_day]; 19 20 int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); 21 int num_Row = 1; 22 int d = 1; 23 tableRow = null; 24 25 for (int i = 0; i < num_day; i++) { 26 27 if (tableRow == null || dayOfWeek == 1) { 28 tableRow = (TableRow) view.findViewById(tableRowId[num_Row]); 29 } 30 31 button[i] = new Button(getActivity()); 32 button[i].setText(Integer.toString(d++) + "-" + dayOfWeek); 33 button[i].setId(i); 34 button[i].setOnClickListener(this); 35 TableRow.LayoutParams tablerowParams = new TableRow.LayoutParams(); 36 tablerowParams.column = dayOfWeek + 2; 37 tableRow.addView(button[i], tablerowParams); 38 dayOfWeek++; 39 if (dayOfWeek > 7) { 40 dayOfWeek = 1; 41 num_Row++; 42 } 43 } 44 45 return view; 46 }

投稿2016/05/26 13:09

dekaaki

総合スコア292

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問