Android 通过扩展布局创建复合控件的替代方法

Android 通过扩展布局创建复合控件的替代方法,android,android-layout,android-view,Android,Android Layout,Android View,我想在Android中创建一个包含一些逻辑的自定义复合控件。在本例中,假设我希望它在单击时在两个视图之间切换 根据,这样做的方法似乎是创建一个扩展布局的新类,并在其中执行所有操作 所以我就这么做了: 我为我的自定义组件创建了一个XML布局: } 最后,我在一些布局中包括了我的自定义视图: 对于复杂的控件,扩展视图或视图组通常是一个不错的选择,但对于像您的示例这样的简单控件,可能会涉及大量不必要的工作。对于您给出的TextView示例,我将扩展TextView并创建处理第二个文本字符串

我想在Android中创建一个包含一些逻辑的自定义复合控件。在本例中,假设我希望它在单击时在两个视图之间切换

根据,这样做的方法似乎是创建一个扩展布局的新类,并在其中执行所有操作

所以我就这么做了:

  • 我为我的自定义组件创建了一个XML布局:

}

  • 最后,我在一些布局中包括了我的自定义视图:

  • 
    
    对于复杂的控件,扩展视图或视图组通常是一个不错的选择,但对于像您的示例这样的简单控件,可能会涉及大量不必要的工作。对于您给出的TextView示例,我将扩展TextView并创建处理第二个文本字符串等的方法。请通读,以查看要复制的功能是如何实现的。
    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/view1"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="Hello"/>
        <TextView
            android:id="@+id/view2"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="World"
            android:visibility="gone"/>
    </RelativeLayout>
    
    public MyWidget(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        RelativeLayout view = (RelativeLayout) inflater.inflate(R.layout.my_widget, this, true);
        mView1 = view.findViewById(R.id.view1);
        mView2 = view.findViewById(R.id.view2);
    
        view.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                switchViews();
            }
        });
    }
    
    public void switchViews() {
        if (mView1.getVisibility() == View.VISIBLE) {
            mView1.setVisibility(View.GONE);
        } else {
            mView1.setVisibility(View.VISIBLE);
        }
        if (mView2.getVisibility() == View.VISIBLE) {
            mView2.setVisibility(View.GONE);
        } else {
            mView2.setVisibility(View.VISIBLE);
        }
    }
    
    <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <com.example.MyWidget
                    android:layout_height="match_parent"
                    android:layout_width="match_parent"/>
    </RelativeLayout