Android. Фрагменты накладываются друг на друга

140
13 января 2019, 09:20

Конечно же, я почитал темы здесь и в гугле. И не нашёл решения. Думаю, оно есть, однако, мне не далось. Только начал пользоваться фрагментами. Делаю с ними второе приложение. В первом заработали после танцев с бубнами. Второй раз не получается, хотя делаю ровно то же самое. На мой взгляд. По теме: при открытии приложения создаётся первый фрагмент (StartFragment), создаётся он в коде через replace. В нём две кнопки, при нажатии на каждую открывается какой-то новый фрагмент. И вот новый открывается, а старый остаётся на заднем фоне. Пробовал делать ремув,он утверждает, что ремувается, однако, остаётся на экране даже в этом случае. Активити, где происходит отображение фрагментов:

import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;
import com.artemonre.justjob.BaseActivity;
import com.artemonre.justjob.BaseController;
import com.artemonre.justjob.BaseFragment;
import com.artemonre.justjob.R;
public class StartActivity extends BaseActivity {
private BaseController baseController;
private StartFragment fragment;
private FragmentTransaction fragmentTransaction;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_start);
    if(savedInstanceState == null) {
        fragmentTransaction = getFragmentManager().beginTransaction();
        fragment = new StartFragment();
        fragmentTransaction
                .replace(R.id.frgmCont, fragment)
                .commit();
    }
}
public void replaceFragment(int containerId, BaseFragment fragment, boolean popBackStack){
    fragmentTransaction = getFragmentManager().beginTransaction();
    fragmentTransaction
            .replace(containerId, fragment)
            .commit();
}
}

Код фрагмента:

    public class StartFragment extends BaseFragment{
    private Button regButton, autButton;
    private View.OnClickListener listener;
    View rootView;
    private BaseFragment fragment;
    private StartFragmentController controller;
    private ViewGroup container;
    private FragmentStartBinding binding;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_start, null);
        binding = FragmentStartBinding.inflate(inflater, container, true);
        this.container = container;
        findViewes();
        setOnClickListener();
        return rootView;
    }
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
   private void replaceFragment(BaseFragment fragment){
        controller.replaceFragment(container, fragment);
    }
    class StartOnClickListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            switch(v.getId()){
                case (R.id.reg_button):
                    Log.d(LOG_TAG, "regButton onClick");
                    fragment = new RegistrationFragment();
                    break;
                case(R.id.aut_button):
                    fragment = new AuthorizationFragment();
                    break;
            }
            if(fragment != null)
                replaceFragment(fragment);
        }
    }
}

Библиотека фрагментов сейчас использована не саппорт, это просто было ради эксперимента. С саппорт происходит абсолютно то же. Никаких эксепшенов обнаружено не было. Заранее благодарен.

UPD. Код "контроллера"

import android.content.Context;
import android.view.ViewGroup;
import com.artemonre.justjob.BaseFragment;
import com.artemonre.justjob.BaseFragmentController;
public class StartFragmentController extends BaseFragmentController {
    private StartActivity activity;
    public StartFragmentController(final Context context, BaseFragment fragment){
        super(fragment);
        activity = (StartActivity)context;
    }
    public void replaceFragment(ViewGroup container, BaseFragment fragment){
        activity.replaceFragment(container.getId(), fragment, true);
    }
}

UPD. BaseFragment. В нём сейчас особо ничего нет (только начал делать приложение и возникла проблема, после чего начал отсекать разные компоненты)

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import static com.artemonre.justjob.BaseActivity.LOG_TAG;
public class BaseFragment extends Fragment implements MainContract.View {
    BaseFragmentController uiController;
    protected View rootView = null;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        rootView.setClickable(true);
        return rootView;
    }
}
Answer 1

Попробуйте вот так:

fragmentTransaction = getSupportFragmentManager().beginTransaction();

У меня была такая же проблема недавно, и мне помогло.

Answer 2

У вас тут путаница с фрагментами, первый вы вставляете в разметку активити:

replace(R.id.frgmCont, fragment)

А второй по сути в разметку первого:

activity.replaceFragment(container.getId(), fragment, true);

где container будет вью первого фрагмента

controller.replaceFragment(container, fragment);

Вот поэтому ничего и не работает как ожидается.

Answer 3

"По теме: при открытии приложения создаётся первый фрагмент (StartFragment), создаётся он в коде через replace."

Первый фрагмент должен создаваться с помощью метода .add

В вашем случае:

fragmentTransaction
            .replace(R.id.frgmCont, fragment)
            .commit();

нужно заменить на:

fragmentTransaction
            .add(R.id.frgmCont, fragment)
            .commit();

UPD. Сотрите ваш код полностью и сделайте по другому:

  1. В активности, создаем фрагмент используя операторы .add , .commit , где указываем разметку нашего контейнера и 1 фрагмент
  2. При нажатии на кнопку, заменяем 1 фрагмент на 2 используя метод replace , где указываем разметку нашего контейнера для фрагментов и сам 2 фрагмент.
Answer 4

У меня бьыла подобная проблема , оказалось что layout второго фрагмента попросту не имеет бэкграунда и поэтому они накладывались друг на друга.

Приведу пример код:

loadFragment(new Fragment_1());

private void loadFragment(Fragment fragment) {
    fragment.setArguments(args);
    transaction = getSupportFragmentManager()
            .beginTransaction()
            .setCustomAnimations(R.anim.animation2, R.anim.animation, R.anim.close, R.anim.closein);
    transaction.replace(R.id.container, fragment);
    transaction.commit();
}

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    style="?attr/layoutBackground" //вот тут или же просто добавьте аттрибут android:background">@drawable/background
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

или типа того)

Answer 5

Нашёл проблему. Сидит за компьютером, как обычно. По существу - проблема в Датабиндинге (с которым я не умею обращаться). Хорошего решения не нашёл - некогда разбираться, что именно не так сделал при биндинге, поэтому просто его удалил из проекта (благо, было немного) и теперь все фрагменты работают, меняются, появляются нормально.

READ ALSO
Имена полей Pojo объекта

Имена полей Pojo объекта

Почему objectMapper не видит сеттеров полей Pojo объекта?

121
java Как правильно спрятать JPanel

java Как правильно спрятать JPanel

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

151
Flex и div overflow проблемы

Flex и div overflow проблемы

Почему у элемента exampleblock не появляется скроллбар? Если допустим ему задать ширину 100%, то не работаетЕсли например задать ширину для container__content,...

170