回答:
電話をaddViewかけるのが正しい答えですが、それを機能させるには、それよりも少し多くする必要があります。
コンストラクター(などButton myButton = new Button();)を介してビューを作成する場合setLayoutParams、新しく作成された子を親ビューに追加する前に、新しく作成されたビューを呼び出し、親ビューのLayoutParams内部クラスのインスタンスを渡す必要があります。
たとえばonCreate()、LinearLayoutにidがあると想定して、関数に次のコードを含めることができますR.id.main。
LinearLayout myLayout = findViewById(R.id.main);
Button myButton = new Button(this);
myButton.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
myLayout.addView(myButton);
LayoutParamsを必ず設定することが重要です。すべてのビューには、少なくともlayout_widthパラメータとlayout_heightパラメータが必要です。また、適切な内部クラスを取得することも重要です。TableRow.LayoutParamsのインスタンスを子ビューのsetLayoutParamsに渡していないことがわかるまで、TableRowに追加されたビューを正しく表示するのに苦労しました。
まだ興味がある人のために:
私が見つけた最善の方法は、Viewの静的静的メソッドを使用することです。
View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);
ここで、yourViewXMLはR.layout.myViewのようなものです。
ビューを追加するためにはViewGroupが必要であることに注意してください(これは考えられるレイアウトです)
例として、すでに表示されているフラグメントがあり、ルートビューがレイアウトであることがわかっていて、それにビューを追加するとします。
View view = getView(); // returns base view of the fragment
if (view == null)
return;
if (!(view instanceof ViewGroup))
return;
ViewGroup viewGroup = (ViewGroup) view;
View popup = View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);
addView(View v){ // your code after get view }を使用して見つかったビューfindViewById(int resourceID)またはインフレートされたビューを取得するようなものinflatedViewです。
これは遅いですが、これは誰かを助けるかもしれません:) :)ビューをプログラムで追加するには、次のようにしてください
LinearLayout rlmain = new LinearLayout(this);
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);
LinearLayout ll1 = new LinearLayout (this);
ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.logo);
LinearLayout .LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
iv.setLayoutParams(lp);
ll1.addView(iv);
rlmain.addView(ll1);
setContentView(rlmain, llp);
これにより、ビュー全体がプログラムで作成されます。同じように任意の数のビューを追加できます。これが役立つことを願っています。:)
プログラムで制約を設定するという考えは面倒な場合があります。以下のこの解決策は、制約、線形などのあらゆるレイアウトで機能します。最適な方法は、プログラムで作成されたビューを期待する場所にプレースホルダー、つまり適切な制約(または線形などの他のレイアウトに適切に配置)を備えたFrameLayoutを設定することです持つため。
必要なのは、プログラムでビューをインフレートすることと、メソッドを使用してFrameLayoutの子としてビューを拡張するaddChild()ことだけです。次に、実行時にビューが膨張し、正しい位置に配置されます。Androidの推奨事項に従って、FrameLayout [リンク]には childViewを1つだけ追加する必要があります。
次のコードは、特定の位置にプログラムでTextViewを作成する場合を想定しています。
ステップ1:
膨張するビューを含むレイアウトで、FrameLayoutを正しい位置に配置し、IDを指定します。たとえば、「コンテナー」です。
ステップ2 実行時に拡張するビューとしてルート要素を使用してレイアウトを作成し、レイアウトファイルを「textview.xml」として呼び出します。
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
</TextView>
ところで、frameLayoutのlayout-paramsをwrap_contentに設定してください。そうしないと、フレームレイアウトは親、つまりアクティビティ、つまり電話スクリーンと同じ大きさになります。
android:layout_width="wrap_content"
android:layout_height="wrap_content"
設定されていない場合、フレームの子ビューはデフォルトでフレームレイアウトの左上に移動するため、ビューは画面の左上に移動するだけです。
ステップ3
oncreateメソッドで、次のようにします。
FrameLayout frameLayout = findViewById(R.id.container);
TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
frameLayout.addView(textView);
(findViewByIdtoの最後のパラメーターを設定し、コンテナービュー(frameLayout)をnull呼び出すことによってビューを追加するaddView()ことはtrue、の3番目のパラメーターを渡してインフレートされたビューを単にアタッチすることと同じですfindViewById()。詳細については、これを参照してください。)