【问题标题】:Is it possible create view without xml in Android?是否可以在 Android 中创建没有 xml 的视图?
【发布时间】:2016-09-11 11:11:49
【问题描述】:

我正在尝试创建一个没有 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) {

    }
}

并在活动中使用它

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>

【问题讨论】:

  • WindowManager.LayoutParams 不适用于Views 内的Activity。我不确定您到底要做什么,但是如果您希望将自定义 View 作为整个布局,只需调用 setContentView() 即可。否则,将其添加到Activity 布局中的ViewGroup。要使用RelativeLayout.LayoutParams 居中,您正在寻找addRule() 方法。
  • 另外,ViewGroup 对布置其子代一无所知。要么实际实现自定义ViewGroup 的其余代码(例如填充空的onLayout() 方法),要么扩展一些具有特定布局规则的其他类(例如,扩展RelativeLayout 而不是尝试包装@987654340 @)。

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


【解决方案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);
    }

}

【讨论】:

  • 好的,但标题要求创建没有 XML 的视图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 2020-07-13
相关资源
最近更新 更多