我可以在Android中创建一个包含UI和逻辑/代码的独立“usercontrol”吗?

时间:2012-02-19 02:05:45

标签: android user-controls components

UserControls - 如何在Android中执行此操作?

我在这里提到的一些问题与我在Android中创建“用户控件”的困难有关,即可定义其布局以及逻辑/代码的可重用组件,可以放在应用程序的任何地方我需要它。

我希望能够:

  • 能够实现该类,以便我有一个实际的对象,我可以访问它的属性,方法等。
  • 将UserControl置于layout-xml文件
  • 中定义的另一个布局中
  • 在Dialog / AlertDialog中使用UserControl

例如,我创建了一个MyUserControl实例。有了它我可以将它放在PopupWindow中并显示它,或者在Dialog / AlertDialog中使用它或在某个地方的布局中使用它。在所有情况下,我都可以访问对象(myUserControl),所以我可以做东西(myUserControl.SetObject(MyObject o)或其他东西)。

简而言之:.NET具有我正在寻找的概念,其模块化的“UserControl”是一个独立的组件,其中包含布局和代码(确保布局xml是一个单独的文件,但那是好)。这有很好的理由,因为我真的很讨厌“代码重复”。我想要一个可以在所有地方使用的代码/组件。

这可行吗?我现在已经有一段时间了。

2 个答案:

答案 0 :(得分:1)

1-为您的组件制作新的xml文件。例如:MyUserControl.xml      - 在此文件中,根据需要制作您的组件。示例:linearLyout有两个按钮。

2-为您的组件创建新类,并从xml文件的根视图扩展它。示例:从LinearLayout扩展。

3 - 将此构造函数添加到您的类

 public ClassName(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.yourXmlFile, this);

    }
    public ClassName(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.yourXmlFile, this);
    }

答案 1 :(得分:-1)

我知道这是一个旧的,但这可能有助于任何人寻找XAMARIN解决方案/回答这个通用问题 -

https://matthewwaring.wordpress.com/2015/02/10/compound-controls-views-with-xamarin-android/

这篇文章以.net的方式展示了代码背后和AXML的分离以及在代码中使用它的各种方法,这里有一个片段,它使用代码隐藏,AXML用于实际的用户控制以及如何将用户控件包含在代码中。父AXML。

“UserControl”的XAML代码 -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/compoundaxmlview_outerlayout">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:text="TextView 1"
        android:id="@+id/compoundaxmlview_textview" />
    <Button
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:text="Button 1"
        android:id="@+id/compoundaxmlview_button" />
</LinearLayout>

后面的代码将此布局加载到控件中并对其进行操作 -

namespace CompoundCustomControlView
{
    public class CompoundAXMLView : LinearLayout
    {

    // ...

    void Initialize ()
    {
        SetBackgroundColor (new Android.Graphics.Color (100, 100, 100));

        Inflate (Context, Resource.Layout.CompoundAXMLViewLayout, this);

        var b1 = FindViewById<Button> (Resource.Id.compoundaxmlview_button);
        var tv1 = FindViewById<TextView> (Resource.Id.compoundaxmlview_textview);

        tv1.Text = "Text2";
        b1.Text = "Button2";

        var layout = FindViewById<LinearLayout> (Resource.Id.compoundaxmlview_outerlayout);

        TextView tv = new TextView (Context);
        tv.Text = "Text2.1";
        Button b = new Button (Context);
        b.Text = "Button2.1";

        // Add inside our layout
        layout.AddView (tv);
        layout.AddView (b);
    }
}

}

将代码包含在父视图中的代码 -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <compoundcustomcontrolview.CompoundAXMLView
        android:layout_width="fill_parent"
        android:layout_height="200dp"
        android:id="@+id/compound2" />
</LinearLayout>