是否有可能在Android中创建没有xml的视图?

时间:2016-05-15 16:27:09

标签: android android-layout android-view android-viewgroup

我正在尝试创建一个没有xml的自定义视图

public class MyView extends ViewGroup {

    public MyView (Context context) {
        super(context);
        setBackgroundColor(0xffff0000);

        RelativeLayout base = new RelativeLayout(context);

        RelativeLayout.LayoutParams rP = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        base.setBackgroundColor(0xff00ff00);
        base.setLayoutParams(rP);

        RelativeLayout.LayoutParams iP = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        ImageView icon = new ImageView(context);
        icon.setBackgroundResource(android.R.drawable.ic_menu_add);
        icon.setLayoutParams(iP);

        addView(icon);
        addView(base);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {

    }
}

并在actitvy中使用它

MyView myview = new MyView(this);
WindowManager.LayoutParams baseParams = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.TYPE_PHONE,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT);
addContentView(myview, baseParams);

但是LayoutParams不起作用,它什么都不显示

我必须使用这个onLayout来显示它,并且基本布局不是MATCH_PARENT而且图标不是WRAP_CONTENT

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    final View child = getChildAt(0);
    final View child2 = getChildAt(1);

    child.layout(0, 0, 300, 300);
    child2.layout(0, 0, 300, 300);
}

我还尝试将图标添加到布局,但应用程序将崩溃

base.addView(icon);

是否可以在没有硬编码大小和位置的情况下创建此布局?

我检查了RelativeLayout.LayoutParams,但我找不到任何方法将它设置为centerInParent为true。

http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@android:drawable/ic_menu_add"
        android:layout_centerInParent="true"
        />
</RelativeLayout>

1 个答案:

答案 0 :(得分:1)

请试试这段代码。

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create parent RelativeLayout
        RelativeLayout relParent = new RelativeLayout(this);
        RelativeLayout.LayoutParams relParentParam = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
        relParent.setLayoutParams(relParentParam);

        // Create child ImageView
        ImageView imgView = new ImageView(this);
        RelativeLayout.LayoutParams imgViewParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        imgView.setLayoutParams(imgViewParams);
        imgView.setImageResource(android.R.drawable.ic_menu_add);
        imgViewParams.addRule(RelativeLayout.CENTER_IN_PARENT);

        // Add child ImageView to parent RelativeLayout
        relParent.addView(imgView);

        // Set parent RelativeLayout to your screen
        setContentView(relParent, relParentParam);
    }

}