Могу ли я создать независимый «пользовательский контроль» в Android, который содержит интерфейс и логику / код? - PullRequest
3 голосов
/ 19 февраля 2012

UserControls - как мне это сделать в Android?

Некоторые из вопросов, которые я задал здесь о SO, связаны с моей борьбой за создание «пользовательских элементов управления» в Android, то есть повторно используемого компонента, который определяетего макет, а также логика / код и могут быть размещены в приложении, где бы мне это ни понадобилось.

Я хочу иметь возможность:

  • Иметь возможность создавать класс таким образом, чтобыУ меня есть реальный объект, к которому я могу получить доступ к его свойствам, методам и т. Д.
  • Поместите UserControl в другой макет, как определено в файле layout-xml
  • Используйте UserControl в Dialog / AlertDialog

Например, я создаю объект MyUserControl.При этом я могу либо поместить его в PopupWindow и отобразить его, либо использовать его в диалоге / AlertDialog ИЛИ использовать его где-нибудь в макете.Во всех случаях у меня есть доступ к объекту (myUserControl), поэтому я могу что-то делать (myUserControl.SetObject (MyObject o) или что-то в этом роде).

Вкратце: .NET имеет концепцию, с которой я ищуего модульный «UserControl», который является независимым компонентом, который содержит как макет, так и код сам по себе (конечно, XML-макет является отдельным файлом, но это нормально).Для этого есть веские причины, так как я действительно ненавижу «дублирование кода».Мне нужен один фрагмент кода / компонента, который можно использовать повсеместно.

Это выполнимо?Я уже давно борюсь с этим.

Ответы [ 2 ]

1 голос
/ 08 декабря 2014

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);
    }
0 голосов
/ 22 апреля 2016

Я знаю, что это старый, но это может помочь любому, кто ищет решение XAMARIN / ответ на этот общий вопрос -

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

В этом посте показано разделение кода и AXML в виде .net и различные способы его использования в коде. Ниже приведен фрагмент, в котором используется codebehind, AXML для фактического пользовательского элемента управления и как включить пользовательский элемент в родительский AXML.

XAML-код для "UserControl" -

<?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>
...