Фрагмент не отображается

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

 BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {

            Fragment frag = new NewviewFragment();
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.add(frag, "nav_newview");
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.addToBackStack(null);
            ft.commit();
           
        }
    };

и это код из моего фрагмента

    package com.example.myapp.ui.newview;
         public class NewviewFragment extends Fragment {
        
public View onCreateView(@NonNull LayoutInflater inflater,
                                         ViewGroup container,Bundle savedInstanceState) {
                    newviewViewModel =
     new ViewModelProvider(this).get(NewviewViewModel.class);
                    root = inflater.inflate(R.layout.fragment_newview, container, false);

            
 newviewViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
                        @Override
                        public void onChanged(@Nullable String s) {
                        //    textView.setText(s);
                        }
                    });
                    return root;
                }
        
        }

а это мой fragment_newview.xml

<?xml version = "1.0" encoding = "utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width = "match_parent"
    android:layout_height = "match_parent"
    tools:context = ".ui.newview.NewviewFragment">


    <WebView
        android:id = "@+id/webview1"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        app:layout_constraintBottom_toBottomOf = "parent"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"

        />



</androidx.constraintlayout.widget.ConstraintLayout>

любая помощь приветствуется!

Звонили onReceive?

Zain 08.04.2021 21:19

Да, я проверил, он вызывается, и я получаю ответ от фрагмента в system.out.println!

stefanosn 08.04.2021 21:20

У вас есть заполнитель в основном макете, на котором вы хотите разместить этот фрагмент?

Zain 08.04.2021 21:32

Что ты имеешь в виду? Я новичок в этом ... покажите мне пример. Есть фрагмент навигации <fragment android: id = "@ + id / nav_host_fragment" android: name = "androidx.navigation.fragment.NavHostFragment" android: layout_width = "match_parent" android: layout_height = "match_parent" app: defaultNavHost = " true "app: layout_constraintLeft_toLeftOf = " parent "app: layout_constraintRight_toRightOf = " parent "app: layout_constraintTop_toTopOf = " parent "app: navGraph = " @ navigation / mobile_navigation "/>

stefanosn 08.04.2021 21:37

и этот макет с панелью инструментов в mainactivity <com.google.android.material.appbar.AppBarLayout android: layout_width = "match_parent" android: layout_height = "wrap_content" android: theme = "@ style / Theme.myapp.AppBarOverlay"> < androidx.appcompat.widget.Toolbar android: id = "@ + id / toolbar" android: layout_width = "match_parent" app: popupTheme = "@ style / Theme.myapp.PopupOverlay"> </androidx.appcompat.widget.Toolbar> </com.google.android.material.appbar.AppBarLayout> <include layout = "@ layout / content_main" />

stefanosn 08.04.2021 21:41

покажите пожалуйста mobile_navigation.xml

Zain 08.04.2021 21:52

<navigation android: id = "@ + id / mobile_navigation" app: startDestination = "@ + id / nav_home"> <fragment android: id = "@ + id / nav_helloworld" android: name = "com.example.myapp.ui .helloworld.HelloworldFrag‌ment "android: label = " @ string / menu_helloworld "tools: layout = " @ layout / fragment_helloworld "/> <fragment android: id = " @ + id / nav_newview "android: name = " com.example .myapp.ui.newview.NewviewFragment "android: label = " @ string / menu_newview "tools: layout = " @ layout / fragment_newview "/> </navigation>

stefanosn 08.04.2021 22:03
1
7
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы используете библиотеку компонентов архитектуры навигации, вам не следует выполнять транзакцию фрагмента вручную с помощью FragmentTransaction.

Вы просто можете совершать транзакции через NavController

BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

        NavController controller = Navigation.findNavController(MainActivity.this, R.id.nav_host_fragment);  // R.id.nav_host_fragment is the id of the placeholder fragment in content_main.xml
        controller.navigate(R.id.nav_newview);           
    }
};

Я предполагаю, что ваше основное действие называется MainActivity, а BroadcastReceiver размещен в этом действии.

ОБНОВИТЬ:

Я не заметил, что вы сделали плавную анимацию с компонентами навигации, чтобы иметь некоторую анимацию:

navController.navigate(R.id.secondFragment, null, getNavOptions());

NavOptions getNavOptions() {
    return new NavOptions.Builder()
            .setEnterAnim(R.anim.fragment_open_enter)
            .setExitAnim(R.anim.nav_default_exit_anim)
            .setPopEnterAnim(R.anim.nav_default_pop_enter_anim)
            .setPopExitAnim(R.anim.nav_default_pop_exit_anim)
            .build();
}

И создайте эти анимации как вам нравится в res/anim

Вы также можете сделать это в mobile_navigation.xml

Без проблем! Надеюсь на лучшее для вас!

stefanosn 09.04.2021 00:31

@stefanosn, пожалуйста, проверьте обновленный ответ .. Я просто не заметил, что вы использовали анимацию

Zain 09.04.2021 00:37

Другие вопросы по теме