Макет не раздувается в пользовательском компоненте Android

я получаю исключение нулевого указателя в моем пользовательском представлении (которое является производным отLinearLayout) потому что это можетне находит своих дочерних взглядов. Вот код:

public class MyView extends LinearLayout
{
    public MyView(Context context, AttributeSet attrs)
    {
        this(context, attrs, 0);
    }

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

    private TextView mText;

    @Override
    protected void onFinishInflate()
    {
        super.onFinishInflate();
        mText = (TextView) findViewById(R.id.text);

        if (isInEditMode())
        {
            mText.setText("Some example text.");
        }
    }
}

Вот макет (my_view.xml):




    


И вот как я положил это в файл XML:

    

Но когда я пытаюсь просмотреть его в редакторе макета, я получаю NPE наmText.setText(...) так какgetViewById() возвращается.null

Какие'происходит?

осветление

Я ожидаю, что это сработает, если я

MyView v = (MyView)inflater.inflate(R.layout.my_view);
((TextView)v.findViewById(R.id.text)).setText("Foo");

все отлично работает Разве это не то, что делает inflater макета, когда он проходит через файл макета? В любом случае, как я могу правильно обрабатывать обе ситуации (без получения бессмысленных вложенных представлений)?

 Timmmm29 окт. 2012 г., 16:28
Я нетам не нужен идентификатор.
 codeMagic29 окт. 2012 г., 15:05
Где это <com.example.views.MyView android: id = "@ + Идентификатор / my_view»         Android: layout_width =»match_parent»         Android: layout_height =»wrap_content "/> ' и почему нетт твойандроид: идентификатор» Скажите, где вы впервые объявите это в макете?

Ответы на вопрос(1)

дставления (com.example.views.MyView) и в то же время пытаетесь добавить TextView внутри. Это'не возможно

Вот что вам нужно изменить:

Вы должны надуть файл XML в коде:

public MyView(Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
    LayoutInflater.from(context).inflate(R.layout.<your_layout>.xml, this);
}
</your_layout>

И измените файл макета XML следующим образом:

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal">

<textview android:id="@+id/text" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" android:ellipsize="end" android:maxlines="4" android:paddingleft="8dp" android:paddingright="8dp" android:text="Some text">

</textview></linearlayout>
 Nic Hartley25 дек. 2017 г., 07:25
Ты уверен что ты'должен иметь?.xml
 fiddler29 окт. 2012 г., 16:13
Конечно, это работает. Это'только то, что вы кладете внутрь Элемент XML будет игнорироваться. Тот'почему TextView не может быть найден.
 Timmmm29 окт. 2012 г., 16:10
Но если я сделаюmyview = (MyView)inflater.inflate(R.layout.my_view, null, false) в каком-то другом коде он работает нормально. Может быть, это ошибка в редакторе макетов (небыть первым!) Плюс вы должны использовать если вы собираетесь делать это так, как вы написали.
 Timmmm29 окт. 2012 г., 16:18
Нет, я имею в виду, если я тогда сделаюmyview.findViewById(R.id.text) это находит представление хорошо. Кажется, что разметчик ведет себя по-разному, если он раздувает пользовательский компонент напрямую, когда он раздувает пользовательский компонентвнутри другой макет. Я'уточню вопрос уточню.

Ваш ответ на вопрос