2017-04-30 12 views
0

タイトルは基本的にはそうです。私はLinearLayoutを拡張するクラスを持っていて、そのLinearLayoutに子を持つようにします。TextView問題は、TextViewが表示されないようです。LinearLayoutにプログラムで追加するとTextViewが表示されません

これまでのところ、私は間違っていますか?

更新:私は君たちが示唆されているとして、次のように私のコードを変更し、そして私のTextViewそれでも表示されない....

public class CalendarCourseView extends LinearLayout { 

    private int height; 
    private int topMargin; 
    private Course course; 

    public CalendarCourseView(Context context, Course course, int topMargin, 
           int height) { 
     super(context); 
     final DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); 
     this.topMargin = (int) TypedValue 
       .applyDimension(TypedValue.COMPLEX_UNIT_DIP, topMargin, displayMetrics); 
     this.height = (int) TypedValue 
       .applyDimension(TypedValue.COMPLEX_UNIT_DIP, height, displayMetrics); 
     this.course = course; 
     this.setBackgroundColor(course.getColor()); 
     setTextView(); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), this.height); 
     ((MarginLayoutParams) getLayoutParams()).topMargin = topMargin; 
    } 

    private void setTextView() { 
     TextView textView = new TextView(this.getContext()); 
     LayoutParams params = new LayoutParams(new LinearLayout.LayoutParams(ViewGroup 
       .LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     textView.setLayoutParams(params); 
     textView.setText(course.getName()); 
     this.addView(textView); 
    } 

} 

アップデート: I、ピンポイントの問題。それはonMeasureと一緒です。 TextViewがheightとtopMarginの変更後にLinearLayoutと同じ位置に配置されていないと思います。

更新: onMeasureでsuper.onMeasureを呼び出すだけで簡単に修正されました。

@Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, this.height); 
     ((MarginLayoutParams) getLayoutParams()).topMargin = topMargin; 
    } 

私はsetMeasuredDimension(int, int)のみを表示していない子供の寸法が変化するため、それがあると信じています。私はonLayoutを上書きしなければならなかったでしょう。 super.onMeasureを呼び出すと、子供と簡略化されたものも変更されます。

+0

: http://stackoverflow.com/questions/13394181/inflated-children-of-custom-linearlayout-dont-show-when-overriding-onmeasure –

+1

'onMeasure'は通常2回以上呼び出されます。そこにレイアウトのものを追加するのは、通常はバッドアイデアです。そして、あなたは 'MeasureSpec 'を使うべきです。getSize(widthMeasureSpec) 'を呼び出すだけではなく、' widthMeasureSpec'を渡すだけではありません。 –

+0

@FlorentSpahiu私はまだ、TextViewがどのように表示されないのかは分かりません。 LinearLayoutはうまく膨らんでいます... – Pants

答えて

0

言われたように、onMeasureメソッドからsetTextViewを呼び出すことは悪い考えです。 onMeasureは、onCreateまたはonStartのように、常に完全に呼び出されるわけではありません。その上に、私はあなたが正しくメインビューにtextViewを追加しているとは思わない。私はそうのようなコンストラクタ内setTextViewを置く:

public MyView(Context context, Course course, int topMargin, 
           int height) { 
     super(context); 
     final DisplayMetrics displayMetrics = getContext().getResources().getDisplayMetrics(); 
     this.topMargin = (int) TypedValue 
       .applyDimension(TypedValue.COMPLEX_UNIT_DIP, topMargin, displayMetrics); 
     this.height = (int) TypedValue 
       .applyDimension(TypedValue.COMPLEX_UNIT_DIP, height, displayMetrics); 
     this.course = course; 
     super.setBackgroundColor(course.getColor()); 
     this.setTextView(); 
    } 

私はまた、あなたが正しいビューにTextViewを追加していないことを追加します。作成したビューではなく、superクラスに追加しています。レイアウトを追加しようとしているビューへの参照を取得する必要があります。

private void setTextView() { 
     TextView textView = new ResponsiveTextView(super.getContext()); 
     LayoutParams params = new LayoutParams(new LinearLayout.LayoutParams(ViewGroup 
       .LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     textView.setLayoutParams(params); 
     textView.setText(course.getName()); 
     //You should reference the object being created rather than the super class 
     this.addView(textView); 

    } 
+0

これはそれを修正していませんでした.... – Pants

+0

私が前に尋ねたように、あなたがXMLを投稿すると、もっと役に立ちそうです。 :) – BlackHatSamurai

+0

関連付けられているxmlはありません。カスタムのLinearLayoutとして使用しています。 @BlackHatSamurai – Pants

2

course.getNameは()

値を持っているかどうかを確認するためにあなたのコードをチェックしてください:多分それは次のようになります。テスト目的のために、

textView.setText( "MyCourseName");

などです。

この例は私のために正しく動作しています。私は、これはすでにここ@Luksprogで答えていると信じ

public class CustomView extends LinearLayout { 

    public CustomView(Context context) { 
     super(context); 
     Log.d("CusotmView", "on constructor after super(context)"); 

     TextView textView = new TextView(this.getContext()); 
     LayoutParams params = new LayoutParams(new LinearLayout.LayoutParams(ViewGroup 
       .LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     textView.setLayoutParams(params); 
     textView.setText("MyText"); 
     this.addView(textView); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     Log.d("CustomView", "onMeasure"); 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 
} 
+0

入力いただきありがとうございます。これは本当にうまくいき、TextViewの位置付けにバグがあったことがわかりました。 – Pants

+0

問題が解決した場合は、正しい答えとしてマークしてください。乾杯 –

関連する問題