簡體   English   中英

如何使用 android 中的按鈕從另一個片段打開片段

[英]How to open a fragment from another fragment using a button in android

我正在嘗試使用按鈕從一個片段到另一個片段我已經向按鈕添加了一個 onClickListener 但是當我單擊該按鈕時應用程序崩潰並且我收到錯誤消息
未找到片段 ReportFragment{afb1ae2} (1513262d-c043-45b9-a229-646e64d334db) id=0x7f08006f} 的 id 0x7f08006f (com.example.streetsafe:id/container) 的視圖。

主要活動

    package com.example.streetsafe;
    
    import android.os.Bundle;
    
    import com.example.streetsafe.ui.report.ReportFragment;
    import com.google.android.material.bottomnavigation.BottomNavigationView;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.fragment.app.FragmentTransaction;
    import androidx.navigation.NavController;
    import androidx.navigation.Navigation;
    import androidx.navigation.ui.AppBarConfiguration;
    import androidx.navigation.ui.NavigationUI;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            BottomNavigationView navView = findViewById(R.id.nav_view);
            // Passing each menu ID as a set of Ids because each
            // menu should be considered as top level destinations.
            AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
                    R.id.navigation_home, R.id.navigation_report)
                    .build();
            NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
            NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
            NavigationUI.setupWithNavController(navView, navController);
    
    
            FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction();
            fragmentTransaction.commit();
    
        }
    
    }

首頁片段

    package com.example.streetsafe.ui.home;
    
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.TextView;
    
    import androidx.annotation.NonNull;
    import androidx.annotation.Nullable;
    import androidx.fragment.app.Fragment;
    import androidx.fragment.app.FragmentTransaction;
    import androidx.lifecycle.Observer;
    import androidx.lifecycle.ViewModelProvider;
    
    import com.example.streetsafe.R;
    import com.example.streetsafe.ui.report.ReportFragment;
    
    public class HomeFragment extends Fragment {
    
        private HomeViewModel homeViewModel;
    
    
        public View onCreateView(@NonNull LayoutInflater inflater,
                                 ViewGroup container, Bundle savedInstanceState) {
            homeViewModel =
                    new ViewModelProvider(this).get(HomeViewModel.class);
            View root = inflater.inflate(R.layout.fragment_home, container, false);
    
            Button btn1=(Button)root.findViewById(R.id.button_report);
    
            btn1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    FragmentTransaction fr=getChildFragmentManager().beginTransaction();
                    fr.replace(R.id.container,new ReportFragment());
                    fr.commit();
                }
            });
    
    
            //retrieves text from home view file
            final TextView textView = root.findViewById(R.id.text_home);
            homeViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
                @Override
                public void onChanged(@Nullable String s) {
                    textView.setText(s);
                }
            });
            final TextView textView1 = root.findViewById(R.id.text_home2);
            homeViewModel.getText1().observe(getViewLifecycleOwner(), new Observer<String>() {
                @Override
                public void onChanged(@Nullable String s) {
                    textView1.setText(s);
                }
            });
    
            return root;
    
    
    
    
        }
    
    }

activity_main.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:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/nav_view"
            android:layout_width="0dp"
            android:layout_height="60dp"
            android:background="#12A3CF"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:menu="@menu/bottom_nav_menu" />
    
        <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_constraintBottom_toTopOf="@id/nav_view"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:navGraph="@navigation/mobile_navigation" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="75dp"
            android:background="@drawable/header"
            android:orientation="vertical"
            android:padding="10dp"
            app:layout_constraintTop_toTopOf="parent"
            tools:layout_editor_absoluteX="20dp">
    
    
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/title_streetsafe"
                android:textColor="#000000"
                android:textSize="45dp" />
        </LinearLayout>
    
    </androidx.constraintlayout.widget.ConstraintLayout>

fragment_home.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.home.HomeFragment">
    
    <Button
            android:id="@+id/button_report"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:text="@string/btn_title_report"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.10"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.828"
            app:backgroundTint="#12A3CF"/>
    
    </androidx.constraintlayout.widget.ConstraintLayout>

似乎是由這一行引起的錯誤:

fr.replace(R.id.container,new ReportFragment());

如果我沒記錯的話,你可以在這里傳遞container參數而不是 id - R.id.container Seems like android can't find any views in fragment's ReportFragment layout, and it's correct behavior for android, cause R.id.containter - is id for ConstraintLayout in activity_main.xml (MainActivity)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM