AndroidのFramelayout内のビューを配置します
-
27-09-2019 - |
質問
プログラムでフレームレイアウト内のビューを追加し、特定の幅と高さでレイアウト内の特定のポイントに配置したいと思います。 FrameLayoutはこれをサポートしていますか?そうでない場合は、中間ビューグループを使用してこれを達成する必要がありますか?
int x; // Can be negative?
int y; // Can be negative?
int width;
int height;
View v = new View(context);
// v.setLayoutParams(?); // What do I put here?
frameLayout.addView(v);
私の最初のアイデアは、FrameLayoutにAbsoluteLayoutを追加し、AbsoluteLayoutの内側にビューを配置することでした。残念ながら、AbsoluteLayoutが非推奨であることがわかりました。
ポインターは大歓迎です。ありがとう。
解決
FrameLayoutを使用すると、すべての子供が画面の左上に固定されているのは事実ですが、パディングを設定するにはまだある程度のコントロールがあります。さまざまな子供に異なるパディング値を設定すると、彼らはフレームレイアウトのさまざまな場所に現れます。
他のヒント
次の例(作業コード)は、FrameLayoutの内側にビュー(Edittext)を配置する方法を示しています。また、frameLayoutのセットパディングセッターを使用して編集の位置を設定する方法を示しています(ユーザーがFrameLayoutをクリックするたびに、Edittextの位置はクリックの位置に設定されます)。
public class TextToolTestActivity extends Activity{
FrameLayout frmLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
frmLayout = (FrameLayout)findViewById(R.id.frameLayout1);
frmLayout.setFocusable(true);
EditText et = new EditText(this);
frmLayout.addView(et,100,100);
frmLayout.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("TESTING","touch x,y == " + event.getX() + "," + event.getY() );
frmLayout.setPadding(Math.round(event.getX()),Math.round(event.getY()) , 0, 0);
return true;
}
});
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@+id/frameLayout1"
android:layout_height="fill_parent" android:layout_width="fill_parent">
</FrameLayout>
</LinearLayout>
また、新しく追加されたビューの周りにマージンを追加して、FrameLayout内に配置することもできます。
FrameLayout frameLayout = (FrameLayout) findViewById(R.id.main); // or some other R.id.xxx
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(0, metrics.heightPixels - 20, 0, 0);
View v = new View(context);
v.setLayoutParams(params);
frameLayout.addView(v);
これにより、画面の下部から20ピクセルのフレームレイアウトが配置されます。
編集: 例を完成させて、それ自体が立っている。そして、ああ、はい、それは機能します。
から リンク Quinn1000が提供:
複数の子供をFramelayoutに追加することはできますが、すべての子供は画面の左上に釘付けにされています。
これは、FrameLayout内の特定のポイントにビューを置くことができないことを意味します(左上隅にあることを除いて:-))。
ビューの絶対的な位置付けが必要な場合は、 AbsoluteLayout:
子供の正確な場所(x/y座標)を指定できるレイアウト。絶対的なレイアウトは、絶対的な位置付けなしで他のタイプのレイアウトよりも柔軟性が低く、維持が難しくなります。
Quinn1000が言ったように、ビューの幅と高さを設定することに関しては、 v.setLayoutParams()
方法a layoutparams オブジェクト、選択したコンテナに応じて(AbsoluteLayout、LinearLayoutなど)
stackoverflowのスレッド
ImageViewのためにどのようにsetlayoutparams()をsetlayoutparams()ですか?
ややカバーします。
たとえば、linearlayout.layoutparams layoutparams = new linearlayout.layoutparams(30、30); yourimageview.setlayoutparams(layoutparams);
linearlayout.layoutparams(またはあなたの場合はframelayout.layoutparams)オブジェクトを定義する必要があることを意味します。
で
http://developer.android.com/reference/android/widget/framelayout.html
それはあなたがあなたのVに尋ねることができるように見えるようにします:
具体的にパラメーターを定義していない場合は、このメソッドを介して生成されたefaultlayoutparams()を生成します。
しかし、それは遅れており、それらのリンクは私の目を少し出血させています。彼らが何かをしているかどうか教えてください:-)