任何人都可以向我解释这些代码吗?创建自定义布局控件

Onu*_*pal 1 android relativelayout

谁能解释我这些代码他们究竟在做什么?我无法理解它是如何添加两个按钮(确定和取消).我希望有一些按钮创建代码new Button()或类似的东西它正在访问带有id的按钮,但在任何xml文件中都没有带有这些id的按钮.我可以R.id.okcancelbar_ok在R文件中看到定义.

谢谢.

原始来源:http://developer.android.com/resources/articles/layout-tricks-merge.html

源代码:http://progx.org/users/Gfx/android/MergeLayout.zip

public class OkCancelBar extends LinearLayout {
    public OkCancelBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOrientation(HORIZONTAL);
        setGravity(Gravity.CENTER);
        setWeightSum(1.0f);
                LayoutInflater.from(context).inflate(R.layout.okcancelbar, this, true);
                TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.OkCancelBar, 0, 0);
                String text = array.getString(R.styleable.OkCancelBar_okLabel);
        if (text == null) text = "Ok";
        ((Button) findViewById(R.id.okcancelbar_ok)).setText(text);
                text = array.getString(R.styleable.OkCancelBar_cancelLabel);
        if (text == null) text = "Cancel";
        ((Button) findViewById(R.id.okcancelbar_cancel)).setText(text);
                array.recycle();
    }}
Run Code Online (Sandbox Code Playgroud)

lou*_*uio 6

LayoutInflater.from(context).inflate(R.layout.okcancelbar, this, true);
Run Code Online (Sandbox Code Playgroud)

这一行用布局R.layout.okcancelbar夸大"this"

((Button) findViewById(R.id.okcancelbar_ok)).setText(text)
Run Code Online (Sandbox Code Playgroud)

这意味着在布局okcancelbar中有一个id为"okcancelbar_ok"的按钮(之前充气)接下来我们为它分配了文本"Ok"

((Button) findViewById(R.id.okcancelbar_cancel)).setText(text);
Run Code Online (Sandbox Code Playgroud)

与上面相同,布局okcancelbar中有一个id为"okcancelbar_cancel"的按钮

所以这段代码做了:1)给视图充气R.layout.okcancelbar 2)获取id为"okcancelbar_ok"的按钮(在前面的布局中声明),并用"okcancelbar_cancel"按钮将文本设置为"Ok"3)idem文字"取消"

"layout/okcancelbar.xml"布局应该是这样的:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <include
        layout="@layout/okcancelbar_button"
        android:id="@+id/okcancelbar_ok" />

    <include
        layout="@layout/okcancelbar_button"
        android:id="@+id/okcancelbar_cancel" />
</merge>
Run Code Online (Sandbox Code Playgroud)

还应该有一个"values/attrs.xml",如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="OkCancelBar">
    <attr name="okLabel" format="string"/>
    <attr name="cancelLabel" format="string"/>
</declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)

最后,"layout/okcancelbar_button"应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Button
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/button"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">    
</Button>
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你