Конечно же, я почитал темы здесь и в гугле. И не нашёл решения. Думаю, оно есть, однако, мне не далось. Только начал пользоваться фрагментами. Делаю с ними второе приложение. В первом заработали после танцев с бубнами. Второй раз не получается, хотя делаю ровно то же самое. На мой взгляд. По теме: при открытии приложения создаётся первый фрагмент (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;
}
}
Попробуйте вот так:
fragmentTransaction = getSupportFragmentManager().beginTransaction();
У меня была такая же проблема недавно, и мне помогло.
У вас тут путаница с фрагментами, первый вы вставляете в разметку активити:
replace(R.id.frgmCont, fragment)
А второй по сути в разметку первого:
activity.replaceFragment(container.getId(), fragment, true);
где container
будет вью первого фрагмента
controller.replaceFragment(container, fragment);
Вот поэтому ничего и не работает как ожидается.
"По теме: при открытии приложения создаётся первый фрагмент (StartFragment), создаётся он в коде через replace."
Первый фрагмент должен создаваться с помощью метода .add
В вашем случае:
fragmentTransaction
.replace(R.id.frgmCont, fragment)
.commit();
нужно заменить на:
fragmentTransaction
.add(R.id.frgmCont, fragment)
.commit();
UPD. Сотрите ваш код полностью и сделайте по другому:
У меня бьыла подобная проблема , оказалось что 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">
или типа того)
Нашёл проблему. Сидит за компьютером, как обычно. По существу - проблема в Датабиндинге (с которым я не умею обращаться). Хорошего решения не нашёл - некогда разбираться, что именно не так сделал при биндинге, поэтому просто его удалил из проекта (благо, было немного) и теперь все фрагменты работают, меняются, появляются нормально.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Хочу по нажатию Кнопки спрятать одну панель, что позволит увидеть другую У меня такой код
Почему у элемента exampleblock не появляется скроллбар? Если допустим ему задать ширину 100%, то не работаетЕсли например задать ширину для container__content,...