Android просмотров в перекрывающихся фрагментах - PullRequest
0 голосов
/ 12 января 2020

Итак, я прочитал несколько уроков и много постов на SO, но до сих пор не могу заставить это работать. Я пытаюсь использовать динамически добавленные фрагменты, но при загрузке фрагмента TextViews и ImageViews во фрагменте продолжают перекрываться, а не обновлять их значения, например так: enter image description here

и фрагменты перекрываются каждый другие при замене.

Я получил основное действие (расширение AppCompatActivity), разделенное на 2 макета:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/background_white"
android:orientation="vertical"
tools:context=".MainActivity">

<FrameLayout
    android:id="@+id/upperFrameLayout"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" />

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/lowerLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
...

Верхний FrameLayout содержит мои фрагменты. Фрагменты в этом методе заменяются в классе MainActivity:

void setMode() {
    // Show "find opponent"- or "fight"-fragment
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();

    if (!debugFight && (btCoordinator == null || !btCoordinator.isConnected())) {
        fragmentTransaction.replace(R.id.upperFrameLayout, new FindOpponentFragment());
    } else {
        fragmentTransaction.replace(R.id.upperFrameLayout, new FightFragment());
    }
    fragmentTransaction.commitNow();
}

Чего мне не хватает?

РЕДАКТИРОВАТЬ: добавлен FightFragment onCreateView () - метод:

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

    ((TextView) inflater.inflate(R.layout.fragment_fight, container, false).findViewById(R.id.score_textView)).setText(getString(R.string.score, 0, 0));
    ((TextView) inflater.inflate(R.layout.fragment_fight, container, false).findViewById(R.id.opponent_textView)).setText(MainActivity.opponentName.toUpperCase());

    final AnimatedVectorDrawableCompat animated = AnimatedVectorDrawableCompat.create(container.getContext(), R.drawable.loading_animated_vector);
    animated.registerAnimationCallback(new Animatable2Compat.AnimationCallback() {
        @Override
        public void onAnimationEnd(Drawable drawable) {
            animated.start();
        }
    });
    ((ImageView) inflater.inflate(R.layout.fragment_fight, container, false).findViewById(R.id.opponent_hand_imageview)).setImageDrawable(animated);
    animated.start();

    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_fight, container, false);
}

... и когда я вставил этот фрагмент кода, я просто понял, что все эти раздутые представления - это разные объекты. Я заменил их одним объектом, который я модифицировал, а затем позволил методу вернуться, и он работает. Я думаю, мне нужно прочитать о взглядах и методе инфляции.

Ответы [ 3 ]

0 голосов
/ 12 января 2020

Используйте это выше фрагмент коммита

fragmentTransaction.addToBackStack(null);
0 голосов
/ 12 января 2020

Я не понял, как работает метод инфляции. Я изменил свои фрагменты на методе CreateView, как это видно в ОП, и теперь он работает.

0 голосов
/ 12 января 2020

использовать фрагмент транзакции. add () вместо replace ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...