LinearLayout
に続いてTextView
が続く水平Spinner
があります。このLinearLayout
は、LinearLayout
内に含まれる固定垂直RelativeLayout
で動的に複数回膨張します。
問題は、Theme.light
からTheme.holo.light
に切り替えたため、TextView
の最後の行が半分にカットされることです。これは、ダイナミックテキストが長く、複数行にわたる場合に発生します。
LinearLayout
およびTextView
を含む水平Spinner
に下部パディングを追加することで、これを修正できました。
これは修正のようには感じませんが、ハックのようです。誰かがこれを適切に修正する方法についてアドバイスをくれますか?
他の質問もいくつか読みましたが、助けになるものはありません。
水平線形レイアウト:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="horizontal">
<TextView
Android:id="@+id/textView1"
Android:layout_width="150dp"
Android:layout_height="wrap_content"
Android:layout_marginRight="20dp"
Android:text="TextView"/>
<Spinner
Android:id="@+id/spinner1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
</LinearLayout>
上記のレイアウトがID ll2_7のリニアレイアウトで動的に拡張される相対レイアウト:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<ScrollView
Android:id="@+id/scrollView"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_above="@+id/relLayoutButtonNext"
Android:layout_below="@id/textView1" >
<RelativeLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="20dp"
Android:paddingLeft="10dp"
Android:paddingRight="10dp"
Android:paddingTop="10dp" >
<TextView
Android:id="@+id/textView10"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:paddingRight="30dp"
Android:text="2.7" />
<TextView
Android:id="@+id/textView11"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginBottom="10dp"
Android:layout_toRightOf="@id/textView10"
Android:text="@string/question2_7" />
<LinearLayout
Android:id="@+id/ll2_7"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView11"
Android:layout_below="@+id/textView11"
Android:orientation="vertical" Android:layout_marginBottom="20dp">
</LinearLayout>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
編集:上記の完全なレイアウトxmlは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<TextView
Android:id="@+id/textView1"
style="@style/question_section_title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true"
Android:text="@string/question2_header" />
<RelativeLayout
Android:id="@+id/relLayoutButtonNext"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:background="@color/bottomBar"
Android:paddingBottom="3dp"
Android:paddingLeft="50dp"
Android:paddingRight="50dp"
Android:paddingTop="3dp" >
<Button
Android:id="@+id/buttonNext"
Android:layout_width="180dp"
Android:layout_height="wrap_content"
Android:layout_alignParentRight="true"
Android:onClick="NeXTSTEP"
Android:text="Next Section"
Android:textSize="20sp" />
<Button
Android:id="@+id/buttonPrevious"
Android:layout_width="180dp"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true"
Android:onClick="previousStep"
Android:text="Previous Section"
Android:textSize="20sp" />
</RelativeLayout>
<ScrollView
Android:id="@+id/scrollView"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_above="@+id/relLayoutButtonNext"
Android:layout_below="@id/textView1" >
<RelativeLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="20dp"
Android:paddingLeft="10dp"
Android:paddingRight="10dp"
Android:paddingTop="10dp" >
<TextView
Android:id="@+id/textView10"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:paddingRight="30dp"
Android:text="2.7" />
<TextView
Android:id="@+id/textView11"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginBottom="10dp"
Android:layout_toRightOf="@id/textView10"
Android:text="@string/question2_7" />
<LinearLayout
Android:id="@+id/ll2_7"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView11"
Android:layout_below="@+id/textView11"
Android:orientation="vertical" Android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
Android:id="@+id/textView2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView10"
Android:layout_below="@+id/ll2_7"
Android:text="2.8" />
<TextView
Android:id="@+id/textView3"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/ll2_7"
Android:layout_toRightOf="@+id/textView10"
Android:text="@string/question2_8" Android:layout_marginBottom="10dp"/>
<LinearLayout
Android:id="@+id/ll2_8"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView3"
Android:layout_below="@+id/textView3"
Android:layout_marginBottom="20dp"
Android:orientation="vertical" >
</LinearLayout>
<TextView
Android:id="@+id/textView4"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView2"
Android:layout_below="@+id/ll2_8"
Android:text="2.9" />
<TextView
Android:id="@+id/textView5"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/ll2_8"
Android:layout_toRightOf="@+id/textView10"
Android:text="@string/question2_9" Android:layout_marginBottom="10dp"/>
<LinearLayout
Android:id="@+id/ll2_9"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/textView5"
Android:layout_toRightOf="@+id/textView10"
Android:orientation="vertical" Android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
Android:id="@+id/textView6"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView4"
Android:layout_below="@+id/ll2_9"
Android:text="2.10" />
<TextView
Android:id="@+id/textView7"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/ll2_9"
Android:layout_toRightOf="@+id/textView10"
Android:text="@string/question2_10" Android:layout_marginBottom="10dp"/>
<LinearLayout
Android:id="@+id/ll2_10"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/textView7"
Android:layout_marginBottom="20dp"
Android:layout_toRightOf="@+id/textView10"
Android:orientation="vertical" >
</LinearLayout>
<TextView
Android:id="@+id/textView8"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView6"
Android:layout_below="@+id/ll2_10"
Android:text="2.11" />
<TextView
Android:id="@+id/textView9"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/ll2_10"
Android:layout_toRightOf="@+id/textView10"
Android:text="@string/quesiton2_11" Android:layout_marginBottom="10dp"/>
<LinearLayout
Android:id="@+id/ll2_11"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView9"
Android:layout_below="@+id/textView9"
Android:orientation="vertical" Android:layout_marginBottom="20dp">
</LinearLayout>
<TextView
Android:id="@+id/textView12"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/textView8"
Android:layout_below="@+id/ll2_11"
Android:text="2.11.1" />
<TextView
Android:id="@+id/textView13"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/ll2_11"
Android:layout_toRightOf="@+id/textView10"
Android:text="@string/question2_11_1" Android:layout_marginBottom="10dp"/>
<LinearLayout
Android:id="@+id/ll2_11_1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_below="@+id/textView13"
Android:layout_toRightOf="@+id/textView10"
Android:orientation="vertical" Android:layout_marginBottom="20dp">
</LinearLayout>
</RelativeLayout>
</ScrollView>
</RelativeLayout>
スクリーンショットに示されているのと同じカットオフ問題に遭遇しました。これは、水平LinearLayout
のベースラインの配置が原因です。 TextView
とSpinner
は、フォントサイズの違いによりベースラインが異なります。この問題を修正するには、次を設定してレイアウトのベースラインの配置を無効にする必要があります。
Android:baselineAligned="false"
またはコード内:
layout.setBaselineAligned(false);
何百万ものことを試した後、私は答えを持っていると思います。
TextViewアイテムにLayoutGravity
を適用しました。
Android:layout_gravity="fill"
私が持っていたすべてのクリッピングの問題を解決するようです。これが同じ問題を抱えている人を助けることを願っています。
私は同じ問題を抱えていて、単純に追加することがわかりました
Android:includeFontPadding="false"
テキストの最終行では、子孫がクリップされなくなりました。
テキストを追加してダミーのスペースを追加しました
textView.setText(firstString+"\n");
私は他のすべての解決策を試しましたが、これが私のために働いた唯一の解決策でした
問題のあるテキストビューをフレームレイアウト内に配置します。兄弟ビューSpinnerが原因で、テキストビューは正しく計算されないと思います。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="horizontal">
<FrameLayout
Android:layout_width="150dp"
Android:layout_height="wrap_content">
<TextView
Android:id="@+id/textView1"
Android:layout_width="150dp"
Android:layout_height="wrap_content"
Android:layout_marginRight="20dp"
Android:text="TextView"/>
</FrameLayout>
<Spinner
Android:id="@+id/spinner1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
</LinearLayout>
この場合、TextView
がコンテナより大きくならないようにする必要があります-
TextView
がwrap_content
に設定されていて、そのコンテナ(または祖先コンテナ)がTextView
に成長する余地を残さない場合は、閉塞できます。
そうでない場合は、TextView
のonMeasure()
が、文字の末尾、非ラテン文字、または斜体のテキストの効果を正しく測定しない場合もあります。これを修正するには、TextView
にグローバルスタイルを設定します。これにより、コードベース全体を変更することなくスタイルが選択されます。
アプリケーション/アクティビティが次のようなカスタムテーマを使用していることを確認します。
<style name="Custom" parent="@Android:style/Theme.Light">
<item name="Android:textViewStyle">@style/Custom.Widget.TextView</item>
</style>
<style name="Custom.Widget.TextView" parent="@Android:style/Widget.TextView">
<item name="Android:gravity">fill</item>
<item name="Android:padding">1sp</item>
</style>
@Rynadtの答えは、上記の段階に到達するのに本当に役に立ちました。ビュー内のテキストの重力を設定すると、一部のデバイスではオクルージョンが発生しないことが保証されます(テキストはビュー内に正しくフィットします)。 TextSize固有の値。
TextViewを拡張し、次のようなカスタムクラスを追加することで、別のソリューションを見つけました。
public class AdaptingTextView extends TextView {
public AdaptingTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public AdaptingTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AdaptingTextView(Context context) {
super(context);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// set fitting lines to prevent cut text
int fittingLines = h / this.getLineHeight();
if (fittingLines > 0) {
this.setLines(fittingLines);
}
}
}
私の解決策は受け入れられたものに近かったが、私はそれを
Android:layout_gravity="fill_vertical"
代わりに。そうしないと、他の行もランダムに配置され、改行が追加されます。たとえば、最大の行には4行あるため、別の行が
this is a testphrase
に
thi
s is
a testph
rase
android:paddingBottom = "20dp"を削除してみてください
から
<RelativeLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:paddingBottom="20dp"
Android:paddingLeft="10dp"
Android:paddingRight="10dp"
Android:paddingTop="10dp" >
任意のタイプのViewGroupでTextViewのグローバルレイアウトリスナーを使用できます。
final TextView dSTextView = (TextView)findViewById(R.id.annoyingTextView);
dSTextView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
dSTextView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
float lineHeight = dSTextView.getLineHeight();
int maxLines = (int) (dSTextView.getHeight() / lineHeight);
if (dSTextView.getLineCount() != maxLines) {
dSTextView.setLines(maxLines);
}
}
});
それについてもっと読むことができます こちら
この問題があり、TextView
がRelativeLayout
内にある場合は、RelativeLayout
をLinearLayout
に切り替えてみてください。
それは私のために問題を修正しました
getViewTreeObserver().addOnGlobalLayoutListener
は、リサイクラビューでは機能しません。リサイクラを使用している場合は、View.addOnLayoutChangeListener
を使用します。
XmlのtextView
に対して定義した省略記号が常に反映されないことがわかったため、textプロパティを再割り当てする前にプログラムで設定しました。これは私のために働いた。
textView.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
textView.removeOnLayoutChangeListener(this);
float lineHeight = textView.getLineHeight();
int maxLines = (int) (textView.getHeight() / lineHeight);
if (textView.getLineCount() != maxLines) {
textView.setLines(maxLines);
textView.setEllipsize(TextUtils.TruncateAt.END);
// Re-assign text to ensure ellipsize is performed correctly.
textView.setText(model.getText());
}
}
});
レイアウトを変更してこれを機能させるためにできることはほとんどないと思います。私が見つけたように、いくつかの方法はいくつかの場合にのみ機能する。私はそれがレイアウト階層全体に依存しており、万能のソリューションではないと思います。また、特にTextViewに設定する別のフォントがある場合に発生することにも気付きました。
私が実験してテストした確かな方法は、ビューが膨張した後にコードでフォント属性を設定できることです。私は、あなたが望むアセット/フォントフォルダにフォントがあると仮定しています。
たとえば、フラグメント内の場合:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.fragment_view, container, false);
TextView tv = (TextView)view.findViewById(R.id.text_view);
tv.setText("Insert text that needs to be displayed");
AssetManager assetManager = getContext().getAssets();
Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf");
tv.setTypeface(typeFace , 0); // 0 is normal font
tv.setPadding(10, 0, 10, 0); // This is not mandatory
}
そしてアクティビティで:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(Resource.Layout.main_activity);
TextView tv = (TextView)this.findViewById(R.id.text_view);
tv.setText("Insert text that needs to be displayed");
AssetManager assetManager = getContext().getAssets();
Typeface typeFace = Typeface.createFromAsset(assetManager, "Fonts/OpenSans-Light.ttf");
tv.setTypeface(typeFace , 0); // 0 is normal font
tv.setPadding(10, 0, 10, 0); // This is not mandatory
}
私もこれと同じ問題を抱えており、非常に迷惑です。
アラビア語のテキストでのみ発生します。
ラベルを複数行にし、文字列の最後に\n
を追加すると、それは修正されますが、問題はこのラベルとその下のオブジェクトの間に大きなギャップがあることですこのフィールドの下に新しい空の行があるという事実。
それを回避するためにカスタムコントロールを行うことができます。しかし、全体的に、これは迷惑なバグです。
これに対する最善の回避策は、ビューの下部に希望する高さのダミービューを追加することです(つまり、これによりパディング自体が追加されます)。
<TableRow
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp" >
<View
Android:layout_width="match_parent"
Android:layout_height="30dp"/>
</TableRow>
私の場合のように、ビューの下部にもう1行テーブルを追加しました。これが誰かを助けることを願っています。
私はそれがとても遅いことを知っていますが、これは私にとって魅力のような仕事です。このコードをtextview
に追加します
Android:ellipsize="Marquee"
Android:layout_weight="1"
テキストビューの下部にパディングを追加します。
Android:paddingBottom="24dp"