Задать вопрос
@ZAndrew

Как сменить фрагмент А на фрагмент Б с перерисовкой Б, если он уже создан. А потом Б на А без перерисовки?

Столкнулся с такой проблемой. Есть графический слой для фрагментов A и Б:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" 
    android:layout_height="match_parent" >
    <LinearLayout android:id="@+id/list_manager_container_layout" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:layout_centerHorizontal="true" 
        android:orientation="horizontal">
   </LinearLayout>
</RelativeLayout>

Сначала создается фрагмент А. При нажатии на кнопку в фрагменте А, на его месте должен появиться фрагмент Б. И наоборот, при нажатии на кнопку в фрагменте Б, на его месте должен появиться фрагмент А.
FragmentManager.replace() не подходит, т.к. фрагмент А при "возврате" из Б перерисовывать не нужно, а фрагмент Б наоборот,нужно создать\перерисовать при каждом переключении на него. Для этих целей я создал
метод в своем Activity, переключающий фрагменты:
public void switchFragment(android.support.v4.app.Fragment switchtofrag,
                           android.support.v4.app.Fragment switchfromfrag,
			   int switcharea, 
			   boolean redraw) {
		android.support.v4.app.FragmentTransaction ft = mVCollectionPageAdapter.mFM.beginTransaction();
		ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
		if (switchtofrag.isAdded()) {
			
			if (redraw) {
			ft.detach(switchtofrag);
			ft.attach(switchtofrag);
			}
			
			ft.show(switchtofrag);
			ft.hide(switchfromfrag);
			
		} else {
		
			ft.hide(switchfromfrag);
			ft.add(switcharea, switchtofrag);
			ft.show(switchtofrag);

		}

		ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

		ft.commit();
	}

Соответветственно, при переключении с А на Б использую redraw=true, с Б на А redraw=false.
Проблема вся в том, что при переключении с А на Б, если он уже существует - switchtofrag.isAdded()=true, сначала на доли секунды появляется старая, неперерисованная версия Б и потом мгновенно уже перерисованная. Выглядит очень это неприглядно. Пробы с перестановкой местами ft.show, ft.hide ничего
не принесли. Как избавиться от такого эффекта? Возможно есть иные способы решения подобных задач? Взываю к Android спецам.
  • Вопрос задан
  • 477 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
enq3
@enq3
Android engineer at #ITX5
На вскидку: при нажатии на кнопку в фрагменте Б вызывать getActivity().getSupportFragmentManager().popBackStack();
Я правильно понял, что при нажатии на кнопку в фрагменте Б, на его месте должен появиться фрагмент А, фактически Вам надо вернуться назад?

activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:id="@+id/fragment">
</FrameLayout>


MainActivity.java
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager().beginTransaction().replace(R.id.fragment, new MainActivityFragment()).commit();
    }


MainActivityFragment.java
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_main, container, false);
        btn = (Button) view.findViewById(R.id.button2);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment, new BlankFragment()).addToBackStack(null).commit();
            }
        });
        return view;
    }


BlankFragment.java
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_blank, container, false);
        btn = (Button) view.findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getActivity().getSupportFragmentManager().popBackStack();
            }
        });
        return view;
    }


Попробуйте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы