困ったパターン
メッセンジャー風のアプリを作ろうと思って、LinearLayoutに右寄せで画像とテキストを並べる画面を作った際に直面した現象。
以下のように記述すると
public class ActivityTest extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 画像アイコン
ImageView iv = new ImageView(getApplicationContext());
iv.setImageResource(R.drawable.ic_launcher);
iv.setLayoutParams(new ViewGroup.LayoutParams(64, 64));
// テキスト
TextView tv = new TextView(getApplicationContext());
tv.setBackgroundColor(0xFF884444);
tv.setText("あいうえお");
LinearLayout layout = new LinearLayout(getApplicationContext());
layout.setOrientation(LinearLayout.HORIZONTAL);
layout.setGravity(Gravity.RIGHT);
layout.addView(tv);
layout.addView(iv);
setContentView(layout);
}
}
こんな感じに表示される。これはOK。
でも、テキストが折り返されるような場合
tv.setText("あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろ");
テキストビュー部分が画面外にはみ出してしまう。
バグなのか書き方が悪いのかわからないけど、とにかくはみ出してしまう。
解決策 その1
テキストビューは残り領域を埋めるように変更。
tv.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT,
1));
これで解決!
と思いきや、、、
そもそも折り返さない時はテキストビューの幅を小さく、という趣旨なのでこれじゃ駄目なのでした。
解決策 その2
根拠は無いけどダミーの領域埋め用のLinearLayoutを作って、その中にTextViewを入れてみる。
public class ActivityTest extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 画像アイコン
ImageView iv = new ImageView(getApplicationContext());
iv.setImageResource(R.drawable.ic_launcher);
iv.setLayoutParams(new ViewGroup.LayoutParams(64, 64));
// テキスト
LinearLayout dummyLayout = new LinearLayout(getApplicationContext());
dummyLayout.setOrientation(LinearLayout.HORIZONTAL);
dummyLayout.setGravity(Gravity.RIGHT);
dummyLayout.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT,
1));
TextView tv = new TextView(getApplicationContext());
tv.setBackgroundColor(0xFF884444);
tv.setText("あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろ");
dummyLayout.addView(tv);
LinearLayout layout = new LinearLayout(getApplicationContext());
layout.setOrientation(LinearLayout.HORIZONTAL);
layout.setGravity(Gravity.RIGHT);
layout.addView(dummyLayout);
layout.addView(iv);
setContentView(layout);
}
}
対処療法感半端ないけど、目的は達成できたのでとりあえずこれで。