пользовательский вид с макетом - PullRequest
34 голосов
/ 09 марта 2010

ки

я пытаюсь встроить пользовательский вид в макет по умолчанию main.xml:

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

    <com.lam.customview.CustomDisplayView
        android:id="@+id/custom_display_view1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />


    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/prev"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="50"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:text="@string/prev" />
    </LinearLayout>
</LinearLayout>

Как вы можете видеть, класс называется com.lam.customview.CustomDisplayView с идентификатором custom_display_view1.

теперь в классе com.lam.customview.CustomDisplayView я хочу использовать другой макет под названием custom_display_view.xml, потому что я не хочу программно создавать элементы управления / виджеты.

custom_display_view.xml - это просто кнопка и изображение, содержимое которого я хочу изменить в зависимости от определенных условий:

<?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"
    >
    <TextView 
    android:id="@+id/display_text_view1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
    <ImageView 
    android:id="@+id/display_image_view1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
    </ImageView>

</LinearLayout>

Я пытался сделать:

1)

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

    try
    {
        // register our interest in hearing about changes to our surface
        SurfaceHolder holder = getHolder();
        holder.addCallback(this);

        View.inflate(context, R.layout.custom_display_view, null);

...

, но получил эту ошибку "03-08 20: 33: 15.711: ОШИБКА / onCreate (10879): Строка двоичного файла XML # 8: Ошибка надувания класса java.lang.reflect.Constructor ».

2)

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

    try
    {
        // register our interest in hearing about changes to our surface
        SurfaceHolder holder = getHolder();
        holder.addCallback(this);

        View.inflate(context, R.id.custom_display_view1, null);

...

, но получил эту ошибку "03-08 20: 28: 47.401: ОШИБКА / CustomDisplayView (10806): идентификатор ресурса # 0x7f050002 тип # 0x12 недопустим «

также, если я сделаю это таким образом, как кто-то предложил, мне не ясно, как custom_display_view.xml связан с классом пользовательского представления.

спасибо.

Ответы [ 6 ]

70 голосов
/ 10 мая 2011

У меня была точно такая же проблема, и проблема была в том, что я использовал неправильный идентификатор ... и похоже, что вы тоже.

Вы должны ссылаться

R.layout.custom_display_view

-not-

R.id.custom_display_view

8 голосов
/ 23 сентября 2014

Этот пост в блоге помог мне понять, что делать безмерно http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/. На случай, если пост блога исчезнет, ​​вот некоторые части кода:

public class Card extends RelativeLayout {
    public Card(Context context) {
        super(context);
        init();
    }

    public Card(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public Card(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        inflate(getContext(), R.layout.card, this);
    }
}

с этим макетом:

<?xml version="1.0" encoding="utf-8"?>

<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/card_padding"
    android:background="@color/card_background">

    <ImageView
        ... />

    <TextView
        ... />

</merge>

Управление включено как:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin">

    <com.trickyandroid.customview.app.view.Card
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/card_background"
        android:padding="@dimen/card_padding"/>

</FrameLayout>

Где com.trickyandroid.customview.app.view - это пространство имен карты класса. Одна вещь, которая была для меня новой, - это тег «слияние», который в конечном итоге является тем же узлом, что и тег «Карта» в содержащем документе.

7 голосов
/ 03 июня 2010

Вы можете накачать cutom_display_view в свой пользовательский класс:

public CustomDisplayView(Context context, AttributeSet attrs) {   
    super(context, attrs);           
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if(inflater != null){       
                inflater.inflate(R.layout.custom_display_view, this);
            }
}
4 голосов
/ 03 июня 2014

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

View.inflate(context, R.layout.custom_display_view, null);

Звоните:

View.inflate(context, R.layout.custom_display_view, this);

См .: Документы

0 голосов
/ 24 сентября 2011

Строка # 8 - ваш пользовательский вид в первом макете.Вы пытаетесь загрузить неправильный макет, поэтому он пытается загрузить себя рекурсивно?(Я просто сделал то же самое)

также у вас есть:

 R.layout.custom_display_view

против

 R.id.custom_display_view1

с 1 на концетам ... какой это?

0 голосов
/ 09 марта 2010

Попробуйте использовать

context.getLayoutInflater().inflate( R.id.custom_display_view1, null );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...