emu雑記

C#erな人が書いているブログです。最近、javaを始めました。なんかいろいろやってます。

TextViewの省略化が突然、無効になって画面をはみ出す現象が発生

AndroidのViewに「TextView」がある。Windows Formで言うところのLabel、wpfで言うところのTextBlock。

TextViewに長い文字列をセットすると、基本的には折り返して全体表示を行う。

でも、1行にまとめたい。
そんなときは、「android:ellipsize」と「android:singleLine」を設定すると省略形で表示できます。

<TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:singleLine="true" />

ここまではいいんですが、同じ画面内にあるEditTextの編集を開始すると、省略形で表示されたTextViewが元に戻ってしまう現象が発生してます。

直接の原因はTableLayoutでした。

↓は省略化が正常な状態

f:id:emu717171:20140805235552p:plain

↓ソフトウェアキーボードを表示すると・・・伸びた!!!

f:id:emu717171:20140805235645p:plain

これ、いろいろな要素が絡み合っているんですが、どうもソフトウェアキーボードが表示されるタイミングで描画処理が行われてるっぽい。

ところが、Activityは破棄されていないのでonResume()も呼び出されないし、ndroid:configChangesも反映されない。

いろいろやっていたんですが、原因は横幅を抑えたい場合に指定するandroid:shrinkColumnsを設定していないことでした。

入力部はもちろん可変で横幅いっぱい表示にしたいので、android:stretchColumnsを設定していたのですが、まさか「横幅を最大に延ばす」設定と「横幅を抑えたい」設定を同時に行う必要があったことは盲点でしたね。

無事に表示されました。
f:id:emu717171:20140806000352p:plain

一応、レイアウトxmlを貼っときます。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1" >

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:shrinkColumns="1"
        android:stretchColumns="1" >

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/text_title"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_marginLeft="5dp"
                android:gravity="right|center_vertical"
                android:singleLine="true"
                android:text="Title:" >
            </TextView>

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginRight="20dp"
                android:orientation="horizontal" >

                <TextView
                    android:id="@+id/text"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:ellipsize="end"
                    android:gravity="center_vertical"
                    android:singleLine="true"
                    android:textAppearance="?android:attr/textAppearanceMedium" >
                </TextView>
            </LinearLayout>
        </TableRow>

        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >


            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginRight="20dp"
                android:layout_span="2"
                android:orientation="horizontal" >

                <EditText
                    android:id="@+id/edit1"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_gravity="bottom"
                    android:layout_marginLeft="5dp"
                    android:hint=""
                    android:maxLength="4"
                    android:scrollHorizontally="true"
                    android:singleLine="true" >
                </EditText>
            </LinearLayout>
        </TableRow>

        <Button
            android:id="@+id/button1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="ボタン1" >
        </Button>

        <Button
            android:id="@+id/button2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="ボタン2" >
        </Button>

        <Button
            android:id="@+id/button3"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="ボタン3" >
        </Button>
    </TableLayout>

</ScrollView>