Установите новый макет в фрагменте

Я пытаюсь изменить макет фрагмента во время выполнения в определенном состоянии.

Начальная компоновка в надутом внутри onCreateView():

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.cancel_video, null);
    }

Затем через некоторое время в коде фрагмента я хотел бы заменить исходный макет на другой макет.

Я пробовал несколько вещей до сих пор; это последнее, что у меня есть:

private void Something(){
    if(checkLicenseStatus(licenseStatus, statusMessage)){
                View vv = View.inflate(getActivity(), R.layout.play_video, null);
                //more code
    }
}

Как я могу это сделать?

Ответ 1

Вы не можете заменить макет фрагмента, как только он надут. Если вам нужны условные макеты, то вам нужно либо изменить макет, либо разбить его на еще более мелкие элементы, такие как Fragments. В качестве альтернативы вы можете сгруппировать все элементы макета в LinearLayout (например, LinearLayout), затем обернуть их все в RelativeLayout, расположить их так, чтобы они перекрывали друг друга, а затем переключать видимость этих LinearLayout с помощью setVisibility() когда и при необходимости.

Ответ 2

Используйте FragmentTransaction через FragmentManger

FragmentManager fm = getFragmentManager();

if (fm != null) {
    // Perform the FragmentTransaction to load in the list tab content.
    // Using FragmentTransaction#replace will destroy any Fragments
    // currently inside R.id.fragment_content and add the new Fragment
    // in its place.
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.fragment_content, new YourFragment());
    ft.commit();
}

Код для класса YourFragment - это только макет LayoutInflater, чтобы он возвращал представление

public class YourFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.your_fragment, container, false);

        return view;
    }   

}

Ответ 3

Да, я сделал это следующим образом. Когда мне нужно установить новый макет (xml), должен быть выполнен следующий фрагмент кода.

  private View mainView;

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup containerObject, Bundle savedInstanceState){
    super.onCreateView(inflater, containerObject, savedInstanceState);

        mainView = inflater.inflate(R.layout.mylayout, null);
        return mainView;
  }

  private void setViewLayout(int id){
    LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mainView = inflater.inflate(id, null);
    ViewGroup rootView = (ViewGroup) getView();
    rootView.removeAllViews();
    rootView.addView(mainView);
  }

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

    setViewLayout(R.id.new_layout); 

Ответ 4

Я буду менять весь макет. Вы можете изменить только определенную часть вашего макета.

  1. Добавьте корневой FrameLayout в your_layout.xml, он ничего не содержит.

    <FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/fl_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
  2. Установите свой контент в коде Java.

    ViewGroup flContent = findViewById(R.id.fl_content);
    
    private void setLayout(int layoutId) {
        flContent.removeAllViews();
        View view = getLayoutInflater().inflate(layoutId, flContent, false);
        flContent.addView(view);
    }
    
  3. Вы можете изменить layoutId бесплатно в какой-то момент.
    Если у вас есть слушатели, вы должны установить снова.