プログラムでlayout_gravityを設定するには?


333

私の質問は簡単です、

プログラムでボタンlayout_gravityを設定するにはどうすればよいですか?

インターネットでこれを見つけましたが、Nullpointer例外がスローされます。

 Button MyButton = new Button(this);

    LinearLayout.LayoutParams  lllp=(LinearLayout.LayoutParams)MyButton.getLayoutParams();
    lllp.gravity=Gravity.RIGHT;
    MyButton.setLayoutParams(lllp); 


    MyLinearLayout.addView(MyButton);

解決策はありますか?


nullではないLayoutParamsを表示する前に、ビューを親に追加する必要があると思います。
Rich Morey 2017

回答:


544

ジャワ

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
params.gravity = Gravity.TOP;

button.setLayoutParams(params);

コトリン

val params = LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT
).apply {
    weight = 1.0f
    gravity = Gravity.TOP
}

重力値について、どのように設定された重力のチェックに重力

基本的LayoutParamsには親に応じて選びます。それはRelativeLayoutLinearLayoutなどすることができます...


1
何らかの理由でparams.gravity = 80(te DocsによるBOTTOMである必要があります)は機能しません。ビューとテキストの下部の間にスペースができました。それほど下揃えではありません...
アダムVarhegyi

51
ドキュメントからの一定の値は、単に間違っている取ると、Gravity.TOP使用してください
Maragues

35
これは「重力」であり、彼は「layout_gravity」を求めました??
M. Usman Khan

10
@usmanいいえ、これはlayout_gravity(つまりLayoutParams.gravity)についてです。それgravitybutton.setGravity()
Floern、

8
SOには、重力とlayout_gravityに関する多くの誤った情報があります。多くのppl setGravity()は、それをlayout_gravityと考えていますが、これは誤りです。この答えは、layout_gravityをプログラムで設定するのに適していることを承認できます。
2016年

54

私は古いスレッドを復活させたくないのですが、これは正しく答えられない問題であり、さらに私自身もこの問題に遭遇しました。

これが長い部分です。答えだけに興味がある場合は、コードまで下にスクロールしてください。

android:gravityとandroid:layout_gravityの動作は異なります。ここでは「私を助けてくれ、私が読んだ記事です。

記事のGIST:重力は高さ/幅が割り当てられた後にビューに影響を与えます。したがって、重心はFILL_PARENTで実行されるビューには影響しません(自動マージンと考えてください)。layout_gravity centerは、FILL_PARENTのビューに影響します(自動パッドと考えてください)。

基本的に、android:layout_gravityはプログラムでアクセスできません。android:gravityのみです。OPの場合と私の場合、受け入れられた回答はボタンを垂直方向の中央に配置しません。

カルティの答えを改善するには:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
button.setLayoutParams(params);

にリンクLinearLayout.LayoutParamsます。

android:layout_gravityは「関連するメソッドがありません」を示し、プログラムからアクセスできないことを意味します。一方、重力はクラスのフィールドです。


また、LinearLayout親の方向に基づいて、重力の自動マージン(より適切な用語がないため)を追加します。提供された記事のリンクが役立ちます。
Uknight

21
MyButton.setGravity(Gravity.RIGHT);

layout_gravityについては、「karthi」によって述べられた答えを使用してください。このメソッドは、重力を設定して子をビュー内に配置します。


37
それはlayout_gravityではなく、重力だけです。
アダムVarhegyi

では、layout_gravityがsetGravityと等しいかどうかを教えてください。次に、重力をどのように設定しますか?
アダムVarhegyi


5
巨大なドキュメントを投稿するソリューションではありません申し訳ありませんが、
アダムVarhegyi

リンクでsetGravity方法について見て...、何とか正確な方法へのリダイレクトが機能していません...
Yashwanthクマール

17

GridLayoutのボタンにlayout_gravityをプログラムで設定することで、同様の問題が発生しました。

トリックは、ボタンlayoutParamsにセット重力たAFTER、ボタンは親(グリッドレイアウト)に添加し、さもなければ重力は無視されます

grid.addView(button)
((GridLayout.LayoutParams)button.getLayoutParams()).setGravity(int)

GridLayout全体のlayout_gravityを変更するにはどうすればよいですか?
Iqbal 2016

15

layou_gravity既存のビューのを変更する場合は、次のようにします。

((FrameLayout.LayoutParams) view.getLayoutParams()).gravity = Gravity.BOTTOM;

LayoutParamsビューが含まれているレイアウトタイプに基づいた権限を使用することを忘れないでください。例:

LinearLayout.LayoutParams


9

この質問は古いですが、同じ問題があり、このように解決しました

LayoutParams lay = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
lay.gravity = Gravity.CENTER;

@Muzikant ..わかりました。最初は気づかなかったのですが、今ははっきりしています。ありがとう
Noman

これは、最初にどのようなレイアウトを指定することによってのみ機能しますか?RelativeLayout.LayoutParamsのように... LayoutParamsの代わりに
ryvianstyron

RelativeLayout.LayoutParamsは、他のフラグを使用してビューの重力を設定します(rightOf、centerInParent、centerVertical)。この回避策は、LinearLayoutsの子供向けです
ノニ

6

KOTLINは、サイズを変更せずにFrameLayoutに複数の重力を設定します。

     // assign more than one gravity,Using the operator "or"
    var gravity = Gravity.RIGHT or Gravity.CENTER_VERTICAL
     // update gravity
    (pagerContainer.layoutParams as FrameLayout.LayoutParams).gravity = gravity
     // refresh layout
     pagerContainer.requestLayout()

時間を節約できます... THX
BertKing

ありがとう兄貴!それは私の時間2を節約します...
YH_WU

4

私はそのようなものを使用しています:(XamarinとC#コード)

  LinearLayout linLayout= new LinearLayout(this); 
    linLayout.SetGravity(GravityFlags.Center);

    TextView txtView= new TextView(this);  
     linLayout.AddView(txtView); 

SetGravityは、textViewをレイアウトの中央に配置します。したがって、SetGravityレイアウトプロパティはレイアウトコンテンツを参照します


4

ビューに重力を設定する必要がある場合は、以下を使用します

Button b=new Button(Context);
b.setGravity(Gravity.CENTER);

ボタンのlayout_gravityを設定するには、layoutparamsに重力フィールドを使用します。

LayoutParams lp=new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.gravity=Gravity.CENTER;

この希望を試してみてくださいこれで感謝が晴れます


3

残りの答えは正しいです。もっと説明を加えたいと思います。layout_gravityは、親ビューにビューを配置する方法についてです。

** parentView.addView()**が呼び出された後、重力を設定する必要があります。コードを見ることができます:

public void setLayoutParams(ViewGroup.LayoutParams params) {
    if (params == null) {
        throw new NullPointerException("Layout parameters cannot be null");
    }
    mLayoutParams = params;
    resolveLayoutParams();
    if (mParent instanceof ViewGroup) {
        ((ViewGroup) mParent).onSetLayoutParams(this, params);
    }
    requestLayout();
}

また、nullポインターの問題は、getLayoutParams()の前にaddViewを呼び出さないためです。

このビューは、親のViewGroupにアタッチされていない場合、または{@ link#setLayoutParams(android.view.ViewGroup.LayoutParams)}が正常に呼び出されなかった場合、このメソッドはnullを返す可能性があります。ビューが親にアタッチされている場合ViewGroup、このメソッドはnullを返してはなりません。」


これも私にとっては... addView()が呼び出された後に重力を設定する必要があることは明らかではありません。新しいビューにすべてを設定してから追加すると、直感的にわかりにくいと思います:-P
kenyee

3

ビューを親の中央に配置したい場合は、次のコードを使用できます。

public class myLayout extends LinearLayout {

    public myLayout(Context context) {
      super(context);

      RelativeLayout vi = (RelativeLayout) ((LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.activity_main, null);
      LinearLayout.LayoutParams cc = new LinearLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      cc.gravity = Gravity.CENTER;
      this.setGravity(Gravity.CENTER);
      this.addView(vi);
  }
}

これらのコードセクションにより、LinearLayoutは最初のビュー要素を親の中央に配置します。したがって、システムはビューを中央に配置するために初期の幅と高さを考慮しません。私はコードセクションをうまくやっています。


i-イタリック))))
アルテム2017

2

RelativeLayoutに、このコードを試してください、それは私のために機能します: yourLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);


2

完璧に機能しています!!! 上記の答えはどれも私にはうまくいきません。Xmlファイルでは、重力の設定とlayout_gravityの設定が異なります。以下のコードをチェックしてください

// here messageLL is the linear layout in the xml file
// Before adding any view just remove all views
   messageLL.removeAllViews();
// FrameLayout is the parent for LinearLayout
FrameLayout.LayoutParams params = new 
   FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
   params.gravity = Gravity.CENTER|Gravity.CENTER_VERTICAL;
   messageLL.setLayoutParams(params);
   messageText.setVisibility(View.GONE);
   messageNoText.setVisibility(View.VISIBLE);
   messageLL.addView(messageNoText);

また、これを確認してください。重力とlayout_gravityに関する明確な説明があります。


1

上記の答えのほとんどは正しいので、ヘルパーメソッドを記述して、プロジェクトで直接使用できるようにします。

layout_gravityプログラムで設定

// gravity types : Gravity.BOTTOM, Gravity.START etc.
// view : can be any view example : button, textview, linearlayout, image etc.

// for single view
   public static void setLayoutGravity(int gravity, View view){
     ((LinearLayout.LayoutParams) view.getLayoutParams()).gravity = gravity;
    }


// for mulitple views
  public static void setLayoutGravity(int gravity, View ...view){
        for(View item : view)
            ((LinearLayout.LayoutParams) item.getLayoutParams()).gravity = gravity;
    }

0

LinearLayout.LayoutParamsからRelativeLayout.LayoutParamsに切り替えて、作成したカスタムサークルビューで必要な結果を最終的に取得しました。

ただし、重力の代わりにaddRuleを使用します

RelativeLayout.LayoutParams mCircleParams = new RelativeLayout.LayoutParams(circleheight、circleheight);

    mCircleParams.addRule(RelativeLayout.CENTER_IN_PARENT);


0
 int width=getResources().getDisplayMetrics().widthPixels; 
 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
                    (width, width);

            params.gravity = Gravity.CENTER;

           iv_main_text = new HTextView(getContext());
            iv_main_text.setLayoutParams(params);
            iv_main_text.setBackgroundColor(Color.BLUE);
            iv_main_text.setTextSize(60);
            iv_main_text.setGravity(Gravity.CENTER);
            iv_main_text.setTextColor(Color.BLACK);

-1
FloatingActionButton sendFab = new FloatingActionButton(this);
    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutParams.setMargins(32, 32, 32, 32);
    layoutParams.gravity = Gravity.END|Gravity.BOTTOM;
    sendFab.setLayoutParams(layoutParams);
    sendFab.setImageResource(android.R.drawable.ic_menu_send);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.