2013-07-19 9 views
5

私は多くの回答を確認しましたが、これまでのところ役に立たなかった。カスタムテキストビューのマージン

私はアンドロイドのTextViewを拡張して、このカスタムビューの余白をコード内に設定しようとしています。これは、ボタンの押下などでインスタンス化するためです。これはLinearLayoutに追加されます。それは私が持っているものです:

public class ResultsView extends TextView { 
    public ResultsView(Context context) { 
     super(context); 
     LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     layout.setMargins(15, 15, 15, 15); 
     setLayoutParams(layout); 
    } 
} 

どこでも余裕がありません。

EDIT:xmlに余白の値を代入すると、機能します。

答えて

14

: は、だから今、あなたのような何かを必要とします:

 protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
      MarginLayoutParams margins = MarginLayoutParams.class.cast(getLayoutParams()); 
      int margin = 15; 
      margins.topMargin = margin; 
      margins.bottomMargin = margin; 
      margins.leftMargin = margin; 
      margins.rightMargin = margin; 
      setLayoutParams(margins); 
     }; 

そして、あなたがコンストラクタを持っているコードを削除し、我々はビューのレイアウトオブジェクトを持っていることを確認するまでのマージンが適用されますこの方法では、これは

よろしくに役立ちます願っています!

+0

よろしく!本当にありがとう!私は実際には以前と同様のものを試しましたが、onFinishInflateでは動作しませんでした。これがパフォーマンス面でどれくらい良いのか分かりますか?ブール値を追加して、すでに一度設定したかどうかを確認してください。 – tom

+0

私はそのような巨大なパフォーマンスの影響はないと思いますが、もしあなたがそれについて懸念している場合は、フラグを追加して一度だけ行うことができます。 –

+1

おそらく、 onLayout()に渡されます(例えばleft + = leftMargin、right = rightMargin、top + = topMargin、bottom- = bottomMargin、super.onLayout(changed、left、top、right、bottom))。 – kcoppock

0

これで、現在表示されているレイアウトにこのビューを追加する必要があります。あなたは次のステップを逃しています。なぜあなたはあなたのResultsViewクラスでこのメソッドをオーバーライドしてみてくださいいけない、私は問題は時間によってあなたがlayoutparamsがまだ設定されていない余白を追加しようとしていること、だと思う

currentlayout.addview(View); 
+0

これはXML形式で追加されています。私はLinearLayoutでtextviewsを見ることができますが、マージンはありません。 – tom