如何在MainActivity中设置Fragment的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在MainActivity中设置Fragment的数据相关的知识,希望对你有一定的参考价值。

我的代码有5个片段与TabLayoutViewPager。代码启动时,名称为“UIstart”的函数初始化UI。而这个功能有

Boolean ValDate = homeFrag.ValidDate();

ValidDate()HomeFragment,这是ViewPager的第一页。 ValidDate()在文本或按钮中设置数据。但是当ValidDate()在UIstart中调用时,我得到了null对象错误。

我该如何修复代码?这是代码的一部分。

这是MainActivity

private void UIstart(){

    Log.d(TAG, "UIstart: start");

    NavigatorUI = Navigator.HOME;



    ValDate = homeFrag.ValidDate();

    ....

   }

这是HomeFragment

public class HomeFragment extends Fragment {

    public String Valid_Date_from;
    public String Valid_Date_to;
    public String[] month = {
            "Jan", "Feb", "Mar", "Apr",
            "May", "Jun", "Jul", "Aug",
            "Sept", "Oct", "Nov", "Dec"
    };

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.gatt_services_characteristics, container, false);

        ValidDate();

        return view;

        } 


        public boolean ValidDate(){

        logD(TAG, "ValidDate() Called");

        Calendar cal = Calendar.getInstance();

        String dateToString , timeToString ;

        dateToString = String.format("%04d%02d%02d", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));


        timeToString = String.format("%02d%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE));

        int []weeks2 = {R.drawable.date_sun,R.drawable.date_mon,
                R.drawable.date_tue,R.drawable.date_wed,R.drawable.date_thur,
                R.drawable.date_fri,R.drawable.date_sat};

        String valdatefrom = Valid_Date_from;
        Calendar c2= Calendar.getInstance();

        c2.set(parseInt(valdatefrom.substring(0, 4))
                , parseInt(valdatefrom.substring(4, 6)) - 1
                , parseInt(valdatefrom.substring(6, 8)));

        String valdateto = Valid_Date_to;
        Calendar c1= Calendar.getInstance();

        c1.set(parseInt(valdateto.substring(0, 4))
                , parseInt(valdateto.substring(4, 6)) - 1
                , parseInt(valdateto.substring(6, 8)));

        Button Valfrom = (Button) view.findViewById(R.id.Val_From_Button); // this code occur null object error
        Button Valto = (Button) view.findViewById(R.id.Val_To_Button);
        TextView Valmonthfrom = (TextView) view.findViewById(R.id.Val_Month_From);
        TextView Valmonthto = (TextView) view.findViewById(R.id.Val_Month_To);
        TextView Valyearfrom = (TextView) view.findViewById(R.id.Val_Year_From);
        TextView Valyearto = (TextView) view.findViewById(R.id.Val_Year_To);
        TextView Valtimefrom = (TextView) view.findViewById(R.id.Val_Time_From);
        TextView Valtimeto = (TextView) view.findViewById(R.id.Val_Time_To);
        TextView  valto_center = (TextView) view.findViewById(R.id.valto_center);
        FrameLayout ExpireLayout = (FrameLayout) view.findViewById(R.id.Expire_Frame);

        ....

        }
答案

在返回view之前,你试图调用ValidDate()方法。 onCreateView()返回view,基于view.findViewById()将能够绑定控件。在你的情况下,你没有返回view,因此NPE

尝试在ValidDate()中调用onViewCreated()方法。

正如阿卜杜勒在评论中提到的那样,ValDate = homeFrag.ValidDate();不是必需的。

另一答案

我认为你应该在ViewPager适配器初始化之后调用homeFrag.ValidDate()方法,所以可能在你的活动UiStart方法中做onCreate()并在onCreate()中初始化viewpager适配器然后覆盖onPostCreated()并调用homeFrag.ValidDate()

以上是关于如何在MainActivity中设置Fragment的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android DatePicker 中设置最小和最大日期?

如何在运行时在由 android studio 创建的导航抽屉中设置默认片段

无法在android中设置背景完全透明

使用Fragment时如何获取控件Id以及如何跳转

无法在 Android 中设置 @react-native-firebase/messaging

android 代码中设置radiobutton选中与为选中颜色