Android расширил LinearLayout, добавил XML с LayoutInflater, findViewById имеет значение null - PullRequest
0 голосов
/ 09 марта 2011

Я создаю пользовательский / расширенный LinearLayout, который я добавляю в ViewAnimator, очевидно, для классных эффектов.

Итак, в моей основной деятельности есть ViewAnimator, и я создаю экземпляр этого NavigationView, над которым я работал, и добавляю его в ViewAnimator в качестве подпредставления. Сам NavigationView использует LayoutInflater, чтобы получить xml для интерфейса, который я создал, и присоединяет его к себе.

Затем я пытаюсь найти этот спиннер, который, как я знаю, имеет правильный идентификатор, и он всегда возвращает ноль. Если я использую этот XML в качестве основного представления содержимого действия, у меня не будет проблем с поиском счетчика.

Вот мой код:

  public class NavigationView extends LinearLayout {

    public NavigationView(Context context) {
        super(context);
        addView(context);
    }

    public NavigationView(Context context, AttributeSet attrs) {
        super(context, attrs);
        addView(context);
    }

    public void addView(Context context) {

        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.nav, this, true);

        Spinner spinner = (Spinner) findViewById(R.id.nav_spinner);
        if(spinner == null) Log.v("spinner", "null");

    } 
   }

Так что я всегда вижу «спиннер» как «ноль» в LogCat.

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

Может быть, раздули, что он не правильно назначает идентификаторы?

Ответы [ 3 ]

1 голос
/ 09 марта 2011

Вы надуваете свое мнение не в то время. Удалите метод addView, переопределите метод onFinishInflate () и выполните инфляцию здесь. * 1001 например *

@Override
    protected void onFinishInflate() {
            super.onFinishInflate();
            ((Activity)getContext()).getLayoutInflater().inflate(R.layout.nav, this);

             Spinner spinner = (Spinner) findViewById(R.id.nav_spinner);
             if(spinner == null) Log.v("spinner", "null");
    }
1 голос
/ 09 марта 2011

Так что не уверен, почему, учитывая несколько хороших предложений и играя с кодом, я в итоге заставил его работать:

public class NavigationView extends LinearLayout {

    public NavigationView(Context context) {

        super(context);
        this.init(context);

    }

    public void init(Context context) {

        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.nav, this, true);

        Spinner spinner = (Spinner) v.findViewById(R.id.navSpinner);
        if(spinner != null) {

            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.nav_sections, android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner.setAdapter(adapter);
        }

    }

}

Кажется, что тот же самый точный код, возможно, мне просто нужно было почиститьмой проект после того, как я снял подчеркивание?

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

Вам нужно вызвать findViewById для раздуваемого вами представления. Это означает, что вам нужно попробовать это:

Spinner spinner = (Spinner) v.findViewById(R.id.nav_spinner);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...