setOnClickListener генерирует исключение nullPointerException во время выполнения

У меня есть активность, которая имеет фрагмент. Этот фрагмент меняет свой макет в зависимости от того, что происходит, например:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View v = null;

    switch(nLesson)
    {
        case 1:
            switch(nPage)
            {
                case 0: v =  inflater.inflate(R.layout.lesson, container, false);
                break;
                case 1: v =  inflater.inflate(R.layout.basic, container, false);
                break;
                case 2: v =  inflater.inflate(R.layout.whatever, container, false);
                    doIt();
                    break;
                case 3: v =  inflater.inflate(R.layout.lesso, container, false); break;
            }
        break;
    }
    return v;
}

Я изменяю значения nLesson и nPage, как это принято, а затем использую

activity.getFragmentManager().beginTransaction()
        .detach(instance)
        .attach(instance)
        .commit();

Я освежаю это.

Однако в одном из этих макетов у меня есть некоторые представления, с которыми я хочу работать. Я пытаюсь установить onClickListener на одном из представлений, но он всегда отображает исключение nullPointerException и прерывается при запуске приложения (не во время компиляции). Я пытался установить onClickListener в "onCreateView","onStart","onResume","onActivityCreatedи т. д. Нигде не работало. Есть идеи?

Спасибо, лучшее!

РЕДАКТИРОВАТЬ: Я добавляю некоторые вещи, которые люди спрашивали меня.

Макет, который ломается, называется "что угодно"; Это tablelayout с 8 tablerows и 8 imagebuttons на каждой tablerow (то есть 8x8=64 квадрата, шахматная доска). Все квадраты обнуляются, когда я пытаюсь добавить к ним слушателя.

Все они похожи на

<ImageButton
             android:id="@+id/squareA8"
             android:contentDescription="@string/r8c1"
             android:layout_height="35dp"
             android:layout_width="35dp"
             android:tag="true"/>

Это код Java, который ломается:

public void doIt()
{
    chessHandler = new ChessHandler(cActivity);
    chessHandler.initialize();
}

ChessHandler - мой класс, я не буду его публиковать, потому что он не имеет отношения к этому делу. Это интересная часть кода:

a8 = (ImageButton)activity.findViewById(R.id.squareA8);
a8.setOnClickListener(new on_click(a8, a,8));

Есть 64 строки, как эти, setOnClickListener перерывы, потому что a 8 по-прежнему установлен в нуль после findViewById,

1 ответ

Решение
a8 = (ImageButton)activity.findViewById(R.id.squareA8);
a8.setOnClickListener(new on_click(a8, a,8));

В типичном onCreateView(), вызов findViewById() на вид, который вы только что надули, а не activity, Вы еще не вернули представление в платформу, и оно не является частью иерархии представлений действий, поэтому никакие дочерние представления не могут быть найдены в действии.