web-dev-qa-db-ja.com

フレームレイアウト内のビューをAndroid

プログラムでFrameLayout内にビューを追加し、特定の幅と高さでレイアウト内の特定のポイントに配置したいと思います。 FrameLayoutはこれをサポートしていますか?そうでない場合は、これを実現するために中間のViewGroupを使用する必要がありますか?

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);

私の最初のアイデアは、AbsoluteLayoutをFrameLayoutに追加し、ビューをAbsoluteLayout内に配置することでした。残念ながら、AbsoluteLayoutが非推奨になっていることがわかりました。

どんなポインタでも大歓迎です。ありがとう。

9
hpique

FrameLayoutを使用すると、すべての子が画面の左上に固定されるのは事実ですが、パディングの設定をある程度制御することはできます。異なる子に異なるパディング値を設定すると、それらはFrameLayoutの異なる場所に表示されます。

2
Tom

次の例(作業コード)は、FrameLayout内にビュー(EditText)を配置する方法を示しています。また、FrameLayoutのsetPaddingセッターを使用してEditTextの位置を設定する方法も示しています(ユーザーが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>
12
tulio84z

新しく追加されたビューの周囲にマージンを追加して、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);

これにより、FrameLayoutが画面の下から20ピクセルに配置されます。

編集:例を完成させたので、それは独立しています。そして、ああ、はい、それは機能します。

2
Michel

リンク から提供されたQuinn1000:

FrameLayoutに複数の子を追加できますが、すべての子は画面の左上に固定されます。

これは、ビューをFrameLayout内の特定のポイントに配置できないことを意味します(左上隅に配置する場合を除く:-))。

ビューの絶対位置が必要な場合は、 AbsoluteLayout を試してください。

子の正確な位置(x/y座標)を指定できるレイアウト。絶対レイアウトは、絶対配置のない他のタイプのレイアウトよりも柔軟性が低く、保守が困難です。

ビューの幅と高さの設定については、Quinn1000が言ったように、選択したコンテナー(AbsoluteLayout、LinearLayoutなど)に応じて、v.setLayoutParams()メソッドに LayoutParams オブジェクトを指定します。 。)

1

ここにあるstackOverflowのスレッド

ImageViewのLayoutParams()をどのように設定しますか?

ややカバーしています。

例:LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(30、30); yourImageView.setLayoutParams(layoutParams);

vオブジェクトのsetLayoutParamsメソッドに渡すには、LinearLayout.LayoutParams(またはこの場合はFrameLayout.layoutParams)オブジェクトを定義する必要があることを意味します。

http://developer.Android.com/reference/Android/widget/FrameLayout.html

それはあなたがあなたのvに次のことを求めることができるようにほとんど見えます:

パラメータを具体的に定義していない場合は、このメソッドを介してgenerateDefaultLayoutParams()。

しかし、それは遅く、それらのリンクは私の目を少し出血させています。彼らが何か助けになるかどうか私に知らせてください:-)

0
Quinn1000