LoginSignup
2
2

More than 5 years have passed since last update.

Gravity.RIGHTなLinearLayoutにTextViewを追加して折り返しをするとTextViewが左にはみ出してしまう件。

Posted at

困ったパターン

メッセンジャー風のアプリを作ろうと思って、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。

device-2013-11-08-175636.png

でも、テキストが折り返されるような場合

        tv.setText("あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろ");

テキストビュー部分が画面外にはみ出してしまう。

device-2013-11-08-175503.png

バグなのか書き方が悪いのかわからないけど、とにかくはみ出してしまう。

解決策 その1

テキストビューは残り領域を埋めるように変更。

        tv.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT,
                1));

これで解決!

device-2013-11-08-181611.png

と思いきや、、、

device-2013-11-08-181659.png

そもそも折り返さない時はテキストビューの幅を小さく、という趣旨なのでこれじゃ駄目なのでした。

解決策 その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);
    }
}

お?
device-2013-11-08-175636.png

おお?!
device-2013-11-08-181611.png

対処療法感半端ないけど、目的は達成できたのでとりあえずこれで。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2