7

[解決済み] android:fillViewport="true"ScrollView に追加する必要がありました。これにより、テキストが垂直方向の中央に配置されない問題が修正されました。

これは以前に何度も回答されていることは知っていますが、テキストビューのテキストを垂直方向に中央揃えすることはまだできません。

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/relativelayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/icon"
            android:layout_width="@dimen/icon_width"
            android:layout_height="@dimen/icon_height"
            android:src="@drawable/picture" />

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/icon"
            android:gravity="center_vertical"
            android:layout_alignBottom="@+id/icon"
            android:layout_alignTop="@+id/icon"
            android:text="@string/title_text"
            android:textSize="@dimen/textsize"
            android:textStyle="bold"
            android:textColor="@color/color"
            android:shadowColor="@color/shadow"
            android:shadowRadius="5"/>

        </RelativeLayout>
</ScrollView>

通常、これは

android:gravity="center_vertical"

しかし、それはテキストビューには影響しません...

奇妙なことに、まったく同じコードの 2 つ目のアプリがあり、そこで問題なく動作しています。

/編集

私の質問を明確にするために:これは私が今持っているものです:
http://i.imgur.com/WwHCegq.png

これは私が欲しいものです:
http://i.imgur.com/9T8CyT6.png

4

8 に答える 8

9

必要な結果を得るには、削除するだけで十分です

android:gravity="center_vertical"
android:layout_alignBottom="@+id/icon"
android:layout_alignTop="@+id/icon"

そして追加

android:layout_centerVertical="true"

代わりは。

于 2013-09-10T18:28:23.737 に答える
1

android:gravity は、親が子を配置する方法を指定します。この場合、親は TextView であり、子はそのビュー内の実際のテキストです。TextView (親) がテキスト (子) よりも広くない場合、重力は影響しません。

参照用の android:gravity ドキュメント:

テキストがビューよりも小さい場合に、テキストをビューの x 軸および/または y 軸に揃える方法を指定します。

TextView の幅を次のように設定します。

android:layout_width="match_parent"

これにより、テキストが垂直方向に中央揃えになるはずです。

于 2013-09-10T16:24:38.607 に答える
0

次のいずれかの方法を試すことができると思います。

  1. TextView で、android:layout_centerVertical="true" を設定します。

また

  1. 最初の答えとして、しかし私はそれが android:layout_height="match_parent" であるべきだと思います

2番目のアプリのコードが機能する理由は、おそらく画像の高さがtextViewと等しいと思います

于 2013-09-10T16:33:42.230 に答える
0

TextView をこのコードに置き換えると、正常に動作します

        <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/icon"
        android:layout_alignParentTop="true"
        android:layout_alignTop="@+id/icon"
        android:layout_toRightOf="@+id/icon"
        android:shadowColor="@color/shadow"
        android:shadowRadius="5"
        android:text="@string/title_text"
        android:textColor="@color/color"
        android:textSize="@dimen/textsize"
        android:textStyle="bold" />
于 2013-09-10T17:41:13.093 に答える
0

この問題を抱えている他の人については、API 18 以降の相対レイアウトにバグがありますhttps://code.google.com/p/android/issues/detail?id=59368を参照してください

私にとってうまくいった修正は、私の相対レイアウトをこのコードに置き換えることでした(上記のリンクにあります)

免責事項 : これは 1 つの特定の状況でのみ機能しました。それは別の恐ろしい失敗でした。気になる方はぜひお試しください

public class FixRelativeLayoutBug extends RelativeLayout {
    public FixRelativeLayoutBug(Context context) {
        super(context);
    }

    public FixRelativeLayoutBug(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public FixRelativeLayoutBug(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    private static final int AT_MOST_UNSPECIFIED = MeasureSpec.makeMeasureSpec((1<<30)-1, MeasureSpec.AT_MOST);

    @Override
    protected void onMeasure(int widthSpec, int heightSpec)
    {
        // RelativeLayout has bugs when measured in UNSPECIFIED height mode that were supposedly fixed
        // in API 18. However the 'fix' does not work with breaks gravity == center_vertical in TextView.
        // https://code.google.com/p/android/issues/detail?id=63673
        if (MeasureSpec.getMode(heightSpec) == MeasureSpec.UNSPECIFIED) heightSpec = AT_MOST_UNSPECIFIED;
        super.onMeasure(widthSpec, heightSpec);
    }
}
于 2014-08-20T18:06:04.963 に答える