每当我尝试从 Fragment java 文件中更改片段的某些属性时,应用程序就会崩溃

Posted

技术标签:

【中文标题】每当我尝试从 Fragment java 文件中更改片段的某些属性时,应用程序就会崩溃【英文标题】:App crashes whenever I try to change some attribute of a fragment from inside the Fragment java file 【发布时间】:2021-05-01 04:19:41 【问题描述】:

所以基本上我面临的问题是,每当我尝试为某个视图分配像 .settext() 这样的值时,我的应用程序就会崩溃。

基本上,我在创建导航抽屉的地方有主要活动。在导航抽屉中,我有两个菜单选项,每个选项在单击时都会打开一个片段。此外,由于第一个片段也是主屏幕,所以每当我打开主活动时,我都会启动第一个片段。

现在,第二个片段是我面临的问题。我有一个带有一些视图的片段布局以及一个片段 java 文件。每当我尝试从 java 文件中为这些视图分配一些值时,应用程序就会崩溃。我已经粘贴了我的片段 xml 文件和 java 文件的代码以及下面的错误。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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_
    android:layout_
    android:orientation="vertical"
    tools:context=".ProfileFragment">

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical">

        <RelativeLayout
            android:id="@+id/up"
            android:layout_
            android:layout_
            android:layout_weight="1.4">

            <com.scwang.wave.MultiWaveHeader
                app:mwhVelocity="2"
                app:mwhStartColor="@color/colorAccent"
                app:mwhCloseColor="@color/colorPrimaryDark"
                app:mwhGradientAngle="-90"
                android:layout_
                android:layout_
                android:id="@+id/waveview"
                />


            <TextView
                android:id="@+id/name_display"
                android:layout_
                android:layout_
                android:layout_centerHorizontal="true"
                android:layout_margin="10dp"
                android:text="User"
                android:textColor="#ffff"
                android:textSize="25sp" />

        </RelativeLayout>

      
    </LinearLayout>
</FrameLayout>

我的java文件是:

public class ProfileFragment extends Fragment 

    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public ProfileFragment() 
        // Required empty public constructor
    

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment ProfileFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static ProfileFragment newInstance(String param1, String param2) 
        ProfileFragment fragment = new ProfileFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        if (getArguments() != null) 
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);

        
    final TextView profile_name = getActivity().findViewById(R.id.name_display);
    profile_name.setText("Hi");
    


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_profile, container, false);
    


我得到的错误是:

2021-01-27 15:31:22.641 29226-29226/com.appname.app E/AndroidRuntime: 致命异常: main 进程:com.appname.app,PID:29226 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)” 在 com.appname.app.ProfileFragment.onCreate(ProfileFragment.java:71) 在 androidx.fragment.app.Fragment.performCreate(Fragment.java:2586) 在 androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:838) 在 androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1197) 在 androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1080) 在 androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:119) 在 androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1866) 在 androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824) 在 androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727) 在 androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150) 在 android.os.Handler.handleCallback(Handler.java:883) 在 android.os.Handler.dispatchMessage(Handler.java:100) 在 android.os.Looper.loop(Looper.java:221) 在 android.app.ActivityThread.main(ActivityThread.java:7542) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

所以我猜的错误是在某个地方:

  profile_name.setText("Hi");

为简单起见,我删除了不必要的代码。

【问题讨论】:

【参考方案1】:

你的代码在这里定义:

  @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        if (getArguments() != null) 
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);

        
    final TextView profile_name = getActivity().findViewById(R.id.name_display);
    profile_name.setText("Hi");
    

但这不是用于片段的正确生命周期方法,相反,您应该覆盖并使用 onViewCreated:

@Override
public void onViewCreated(@NotNull View view, @org.jetbrains.annotations.Nullable Bundle savedInstanceState) 
    super.onViewCreated(view, savedInstanceState);
    // your code here
    

更多信息here,但具体来说:

Fragment 中的 onCreate() 方法在 Activity 的 onAttachFragment() 之后在 Fragment 的 onCreateView() 之前调用。

所以目前还没有视图,所以这就是你的代码崩溃的原因

【讨论】:

现在 android studio 在 @NotNull 和 jetbrains 上出现红色错误 不知道,自己生成覆盖方法 谢谢伙计,它现在工作浪费了一整天,但最后感谢你现在开始工作 没问题,当您还在学习时,片段可能会像那样棘手,通常如果您不确定哪种生命周期方法,您希望在 onViewCreated 内部进行工作使用 好的,我想我知道了.. 谢谢 :)

以上是关于每当我尝试从 Fragment java 文件中更改片段的某些属性时,应用程序就会崩溃的主要内容,如果未能解决你的问题,请参考以下文章

每当有人尝试从 Python 中的特定文件夹复制任何文件时如何记录日志

如何从 Django 模板/上下文中更改为字符串并删除 '?

Java Android - 将数据从活动发送到片段

点击列表视图,从Fragment打开新的Activity

电子邮件缩略图 URL 在 gmail 中更改为 googleusercontent.com

从 Fragment 到 Activity 的意图 - Android Java