Замена фрагмента на фрагмент

401
18 февраля 2017, 05:37

Есть фрагмент Fragment1, на него с помощью RecyclerView выводятся Button в адаптере это выглядит следующим образом:

@Override
public void onBindViewHolder(final ViewHolder holder,final int position){
    final Fragment1 fragment1 = new Fragment1();
    final int id = (listItems.get(position).getId());
    holder.button.setText(listItems.get(position).getName());
    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                    switch (v.getId()) {
                        case R.id.button:
                            fragment1.replaceFragment(id);
                            break;
                        default:
                            break;
                    }
                }
        });
}

Метод replaceFragment() прописан в классе Fragment1 используется для определения нажатой кнопки и замещения Fragment1 на Fragment2, Fragment3 и т.д. Выглядит это так:

public class Fragment1 extends Fragment{
private RecyclerView recyclerView;
private RecyclerAdapter adapter;
private FragmentTransaction fragmentTransaction;
private List<RecyclerItem> listItems;
private Context context;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.pb_layout,null);
    recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(context));
    listItems = new ArrayList<>();
    adapter = new RecyclerAdapter(listItems, getActivity());
    recyclerView.setAdapter(adapter);
    return v;
}
public void replaceFragment(int id){
    fragmentTransaction = getFragmentManager().beginTransaction();
    switch (id){
        case 1:
            fragmentTransaction.replace(R.id.containerView, new Fragment2()).commit();
            fragmentTransaction.addToBackStack(null);
            break;
        case 2:
            fragmentTransaction.replace(R.id.containerView, new Fragment3()).commit();
            fragmentTransaction.addToBackStack(null);
            break;
        default:
            break;
    }
}}

Вроде должно работать но выбивает ошибку:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()' on a null object reference

В строке: fragmentTransaction = getFragmentManager().beginTransaction();

Подскажите пожалуйста в чем причина.

Answer 1

Вы создаете фрагмент:

Fragment1 fragment1 = new Fragment1();

После этого в переменной fragment1 хранится ссылка на созданный фрагмент, который еще не привязан ни к какой активити (у этого фрагмента нет хоста в виде активити).

Далее Вы вызываете метод фрагмента:

fragment1.replaceFragment(id);

В котором, в частности, происходит получение FragmentManager'а:

fragmentTransaction = getFragmentManager().beginTransaction();

Метод getFragmentManager() класса Fragment возвращает FragmentManager активити, которая является хостом для данного фрагмента.

Так как данный фрагмент не связан ни с какой активити, то метод getFragmentManager() возвращает null и далее происходит вызов нестатического метода на null-объекте, в результате чего и генерируется NullPointerException.

Вообще не очень понятно: если у Вас RecyclerView находится во фрагменте Fragment1, то зачем в адаптере Вы создаете новый инстанс Fragment1? Взаимодействуйте непосредственно с тем фрагментом, в котором находится RecyclerView.

READ ALSO
Объекты статических классов

Объекты статических классов

Здравствуйте уважаемые знатоки)Недавно в процессе изучения Java(путем прохождения javarush) наткнулся на вот такой код, вызвавший у меня когнитивный...

424
Как добавить новую запись к таблице, извлеченной из базы данных java?

Как добавить новую запись к таблице, извлеченной из базы данных java?

Возможно ли добавить новую запись(нового пользователя) в таблицу, которую извлекли из базы данных? При нажатии кнопки должны открываться...

340
Управление пользователями Tomcat с помощью Spring Security

Управление пользователями Tomcat с помощью Spring Security

В tomcat-usersxml задаются пользователи с определенными правами

301