web-dev-qa-db-ja.com

Android FrameLayoutの中央ビューが機能しない

2つのコントロールがあるFrameLayoutがあります。

両方をFrameLayoutの中央に配置したいのですが、どうしてもできません。 Texviewの中心はきちんと調整されており、表示するとき、私のcusomビューは左側に残ります。

<FrameLayout Android:id="@+id/CompassMap"
               Android:layout_width="fill_parent" 
               Android:layout_height="wrap_content"
               Android:layout_weight="1"
               Android:gravity="center">

             <view class="com.MyView"
        Android:id="@+id/myView"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical|center_horizontal"
        Android:visibility="gone"/>

                <TextView Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical|center_horizontal"
        Android:text="CENTERED" /> 
</FrameLayout>

Mathiasにとって、私はコンストラクターで何もしません。ただ単純です

   public class MyMapView extends View {

private int xPos = 0; 
private int yPos = 0;
private Bitmap trackMap;

private Matrix backgroundMatrix;
private Paint backgroundPaint;

private Bitmap position;
private Matrix positionMatrix;
private Paint positionPaint;

public MyMapView(Context context) {
    super(context);
    init(context, null);
}

public MyMapView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
}

public MyMapView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context, attrs);
}

private void init(final Context context, AttributeSet attrs) {

backgroundMatrix = new Matrix();
backgroundPaint = new Paint();
backgroundPaint.setFilterBitmap(true);

position = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.position);
positionMatrix = new Matrix();

positionPaint = new Paint();
positionPaint.setFilterBitmap(true);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
}

@Override
protected void onDraw(Canvas canvas) {

    int width = getMeasuredWidth();
    int height = getMeasuredHeight();

    if (trackMap!=null)
    {
        Bitmap resizedBitmap = Bitmap.createScaledBitmap(trackMap, height, height, true);
        canvas.drawBitmap(resizedBitmap, backgroundMatrix, backgroundPaint);

    }

        canvas.save(Canvas.MATRIX_SAVE_FLAG);
        canvas.translate(xPos-position.getWidth()/2, yPos-position.getHeight()/2);
        canvas.drawBitmap(position, positionMatrix, positionPaint);

        canvas.restore();
}

    public void updatePosition(int xpos, int ypos, Bitmap trackImage)
    {
        xPos=xpos;
        yPos=ypos;
        trackMap = trackImage;
        invalidate();
    }
}
72
Alin

FrameLayoutではなくRelativeLayoutをお勧めします。

TextViewを常にImageViewの下にしたい場合、次のレイアウトを使用します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content">
    <ImageView
        Android:id="@+id/imageview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentTop="true"
        Android:layout_centerInParent="true"
        Android:src="@drawable/icon"
        Android:visibility="visible"/>
    <TextView
        Android:id="@+id/textview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:layout_below="@id/imageview"
        Android:gravity="center"
        Android:text="@string/hello"/>
</RelativeLayout>

要素のvisibilitygoneに設定すると、その要素が消費するスペースはなくなりますが、代わりにinvisibleを使用すると、消費されるスペースは保存されます。

TextViewをImageViewの上に配置する場合は、Android:layout_alignParentTopを省略するか、falseに設定し、TextViewではAndroid:layout_below="@id/imageview"属性を省略します。このような。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content">
    <ImageView
        Android:id="@+id/imageview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentTop="false"
        Android:layout_centerInParent="true"
        Android:src="@drawable/icon"
        Android:visibility="visible"/>
    <TextView
        Android:id="@+id/textview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:gravity="center"
        Android:text="@string/hello"/>
</RelativeLayout>

これがあなたが探していたものであることを願っています。

36

子ビューのlayout_gravityを設定することにより、FrameLayoutの中央にビューを配置できます。

XMLの場合:

Android:layout_gravity="center"

In Java code:

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

注:他の既存のLayoutParamsではなく、FrameLayout.LayoutParamsを使用してください

341
userrp1519825

この順番に従ってください

FrameLayoutの任意の数の子を中央に配置できます。

<FrameLayout
    >
    <child1
        ....
        Android:layout_gravity="center"
        .....
        />
    <Child2
        ....
        Android:layout_gravity="center"
        />
</FrameLayout>

キーは

子ビューにAndroid:layout_gravity="center"を追加します。

例えば:

このようなFrameLayoutCustomViewTextViewを中央に配置しました

コード:

<FrameLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    >
    <com.airbnb.lottie.LottieAnimationView
        Android:layout_width="180dp"
        Android:layout_height="180dp"
        Android:layout_gravity="center"
        app:lottie_fileName="red_scan.json"
        app:lottie_autoPlay="true"
        app:lottie_loop="true" />
    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:textColor="#ffffff"
        Android:textSize="10dp"
        Android:textStyle="bold"
        Android:padding="10dp"
        Android:text="Networks Available: 1\n click to see all"
        Android:gravity="center" />
</FrameLayout>

結果:

enter image description here

1
Rohit Singh

ウィジェットのlayout_gravity属性の「center_horizo​​ntal」と「center_vertical」または単に「center」を設定します

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".MovieActivity"
    Android:id="@+id/mainContainerMovie"
    >


    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="#3a3f51b5"
       />

    <ProgressBar
        Android:id="@+id/movieprogressbar"
        style="?android:attr/progressBarStyle"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical|center_horizontal" />
</FrameLayout>
1
MN. Vala

ビューをFramelayoutの中央に配置するには、いくつかの利用可能なトリックがあります。 WebviewとProgressbarに使用した最も単純なもの(2つのオブジェクトレイアウトに非常に似ています)を追加しましたAndroid:layout_gravity="center"

他の誰かが同じことをする必要がある場合の完全なXMLは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"

    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".WebviewPDFActivity"
    Android:layout_gravity="center"
    >
    <WebView
        Android:id="@+id/webView1"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"

        />
    <ProgressBar
        Android:id="@+id/progress_circular"
        Android:layout_width="250dp"
        Android:layout_height="250dp"
        Android:visibility="visible"
        Android:layout_gravity="center"
        />


</FrameLayout>

これが私の出力です

screenshot

0
Abdul Rehman