我可以在包含 UI 和逻辑/代码的 Android 中创建一个独立的“用户控件”吗?
Posted
技术标签:
【中文标题】我可以在包含 UI 和逻辑/代码的 Android 中创建一个独立的“用户控件”吗?【英文标题】:Can I create an independent "usercontrol" in Android that contains UI and logic/code? 【发布时间】:2012-03-09 21:39:06 【问题描述】:UserControls - 我如何在 android 中做到这一点?
我在 SO 上提出的一些问题与我在 Android 中创建“用户控件”的斗争有关,即定义其布局和逻辑/代码的可重用组件,并且可以放置在应用程序中的任何位置我需要它。
我希望能够:
能够实例化该类,以便我拥有一个可以访问其属性、方法等的实际对象 将 UserControl 放置在 layout-xml 文件中定义的另一个布局中 在 Dialog/AlertDialog 中使用 UserControl例如,我创建了一个 MyUserControl 的实例。有了它,我可以将它放在 PopupWindow 中并显示它,或者在 Dialog/AlertDialog 中使用它,或者在某处的布局中使用它。在所有情况下,我都可以访问对象 (myUserControl),所以我可以做一些事情(myUserControl.SetObject(MyObject o) 或其他东西)。
简而言之:.NET 的模块化“UserControl”具有我正在寻找的概念,它是一个独立的组件,其中包含布局和代码(当然,布局 XML 是一个单独的文件,但这是好的)。这有充分的理由,因为我真的很讨厌“代码重复”。我想要一个可以在任何地方使用的代码/组件。
这可行吗?
【问题讨论】:
那是很多文字。做一个简短的谷歌搜索可能会引导你到Custom Components documentation,它解释了你所问的一切。 不,我已经通读了,我已经用谷歌搜索了几个小时,我一遍又一遍地阅读了这个论坛,但我还没有找到解决问题的方法。您发布的链接没有帮助,因为它根本没有回答我的问题。 我建议您尝试使用该页面上几乎没有描述的技术来完成我在帖子中提到的事情。没有信息可以帮助解决这个问题。我有自定义组件(扩展不同的布局),扩展对话框等,但没有一个真正符合我想要的。 我已经使用该文档中描述的内容构建了您在此处描述的组件,所以我已经尝试过了。您可能有误解或没有正确阅读该网站,但我相信这正是您所需要的。 您能否创建一 (1) 个“组件”(扩展布局),我可以在对话框、设计时布局中使用并且同时能够实例化?我很想知道如何... 【参考方案1】:我知道这是一个旧的,但这可能会帮助任何寻找 XAMARIN 解决方案/回答这个通用问题的人 -
https://matthewwaring.wordpress.com/2015/02/10/compound-controls-views-with-xamarin-android/
这篇文章以 .net 方式展示了代码隐藏和 AXML 的分离以及在代码中使用它的各种方式,这里是一个使用代码隐藏的 sn-p,用于实际用户控件的 AXML 以及如何包含用户控件在父 AXML 中。
“用户控件”的 XAML 代码 -
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_
android:layout_
android:id="@+id/compoundaxmlview_outerlayout">
<TextView
android:layout_
android:layout_
android:text="TextView 1"
android:id="@+id/compoundaxmlview_textview" />
<Button
android:layout_
android:layout_
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_
android:layout_>
<compoundcustomcontrolview.CompoundAXMLView
android:layout_
android:layout_
android:id="@+id/compound2" />
</LinearLayout>
【讨论】:
【参考方案2】: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);
【讨论】:
以上是关于我可以在包含 UI 和逻辑/代码的 Android 中创建一个独立的“用户控件”吗?的主要内容,如果未能解决你的问题,请参考以下文章