Установите новый макет в фрагменте
Я пытаюсь изменить макет фрагмента во время выполнения в определенном состоянии.
Начальная компоновка в надутом внутри 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
Я буду менять весь макет. Вы можете изменить только определенную часть вашего макета.
-
Добавьте корневой 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" />
-
Установите свой контент в коде 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);
}
-
Вы можете изменить layoutId
бесплатно в какой-то момент.
Если у вас есть слушатели, вы должны установить снова.