2015-08-31 4 views
0

Я прошел несколько онлайн-курсов на Android. И начал мой первый проект. В настоящее время я застреваю в создании своего собственного виджета.Пользовательские элементы управления Android

Я не могу найти информацию о том, как переопределить стили управления по умолчанию или как сгруппировать элементы управления по умолчанию в пользовательский элемент управления. Проблема заключается в следующем:

Когда мы создаем расширение Activity, существует метод onCreated, где мы указываем, какой формат XML использовать. На мой взгляд, так же должны быть созданы пользовательские элементы управления.

Например, я хочу, чтобы создать элемент управления, который будет иметь ImageView и некоторые кнопки, какой тип будет зависеть от данных, поступающих с сервера (кнопка электронной почты, кнопка скайп или любой другой)

Так я создал класс:

public class InteractiveHeaderControl extends View { 

    public InteractiveHeaderControl(Context context) 
    { 
     super(context); 
    } 
} 

Я создал макет:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" android:layout_height="match_parent"> 
<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 
<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:text="TEST" 
    android:layout_marginLeft="20dp"/> 
<LinearLayout 
    android:id="@+id/button_stack" 
    android:layout_width="wrap_content" 
    android:layout_height="50dp" 
    android:orientation="horizontal" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentRight="true"> 

    <Button 
     android:layout_width="50dp" 
     android:layout_height="50dp" /> 
    <Button 
     android:layout_width="50dp" 
     android:layout_height="50dp" /> 
    <Button 
     android:layout_width="50dp" 
     android:layout_height="50dp" /> 
</LinearLayout> 
</RelativeLayout> 

Таким образом, вопрос, как я могу применить эту схему к моему контролю и poulate button_stack во время выполнения?

Например, в коде я хочу, чтобы создать этот элемент управления, как:

InteractiveHeaderControl control = new InteractiveHeaderControl(List<button>); 

и управления конструктору обрабатывать переданный параметр.

ответ

1

Используйте макет вместо представления. Вот пример:

public class DefaultHeading extends FrameLayout {   

    public DefaultHeading(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View view = mInflater.inflate(R.layout.default_heading, this, true); 

     addView(view); 
    } 

И если вы хотите использовать некоторые атрибуты:

Добавить это res-> с ценностно> attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="awesomeedit"> 
     <attr name="regex" format="string"/> 
     <attr name="name" format="string"/> 
     <attr name="hint" format="string"/> 
     <attr name="error" format="string"/> 
     <attr name="required" format="boolean"/> 
     <attr name="link" format="string"/> 
     <attr name="email" format="boolean"/> 
     <attr name="number" format="boolean"/> 
     <attr name="password" format="boolean"/> 
    </declare-styleable> 
</resources> 

использовать его в файл макета :

<yourpackage.DefaultHeading 
... 

android:layout_width="match_parent" 
android:layout_height="wrap_content" 
app:error="@string/not_valid_email_msg" 
... 
> 

Получить значения:

public class DefaultHeading extends FrameLayout { 



    public DefaultHeading(Context context, AttributeSet attrs) { 
     super(context, attrs); 


TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.awesomeedit, 0, 0); 
     String name; 
     String regex; 
     String hint; 
     String error; 
     String link; 
     try { 
      name = ta.getString(R.styleable.awesomeedit_name); 
      regex = ta.getString(R.styleable.awesomeedit_regex); 
      hint = ta.getString(R.styleable.awesomeedit_hint); 
      error = ta.getString(R.styleable.awesomeedit_error); 
      link = ta.getString(R.styleable.awesomeedit_link); 
      required = ta.getBoolean(R.styleable.awesomeedit_required, false); 
      email = ta.getBoolean(R.styleable.awesomeedit_email, false); 
      password = ta.getBoolean(R.styleable.awesomeedit_password, false); 
      nummber = ta.getBoolean(R.styleable.awesomeedit_number, false); 
     } finally { 
      ta.recycle(); 
     } 
     LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View view = mInflater.inflate(R.layout.default_heading, this, true); 

     addView(view); 
    } 
1

Есть много способов, как это сделать. Для начала чтения:

  1. How to create custom components
  2. How to create custom views in general

Во-первых, вы должны скорее создать собственный ViewGroup вместо пользовательских View. Я советую не передавать List экземпляров экземпляра actall (в вашем случае Buttons) через ваш конструктор, но лучше просто передать некоторую информацию (название, что делать после нажатия, ...), а затем создать свои кнопки в компоненте сам ..

+0

спасибо. Я прочту их. – Cheese

Смежные вопросы