首页 > 解决方案 > 片段 Tab2NewFragment 未附加到上下文

问题描述

在我的一个导航抽屉片段(NewFragment)中,有 3 个选项卡(Tab1NewFragment、Tab2NewFragment、Tab3NewFragment),当在 Tab1NewFragment(btn_calculate)中单击一个按钮时,在 Tab2NewFragment 中调用一个方法(set_outputs)。但是它说片段未附加到上下文。问题是什么?

*顺便说一句,我在调用 set_outputs 方法 (tab2NewFragment_obj.set_outputs(getActivity());) 时发送活动的原因是,当我尝试从 Tab2Newfragment 本身获取活动时,它产生了 NullPointerException 但这解决了它。

主要活动:

TabLayout tabLayout = findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
    tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    final ViewPager viewPager = findViewById(R.id.pager);
    MyPagerAdapter MyPagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
    viewPager.setAdapter(MyPagerAdapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

Tab1新片段:

btn_calculate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        tab2NewFragment_obj.set_outputs(getActivity()); **//line478**
        }
    });

Tab2NewFragment:

        public class Tab2NewFragment extends Fragment {
        TextView frame_size_result;
        //...


        public Tab2NewFragment() {
        // Required empty public constructor
         }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup                  container, Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.tab2_new_fragment,
            container, false);
      //find views
      result_bmi_textView =  view.findViewById(R.id.result_bmi_textView);
      //...

  return view;
   }
    public void set_outputs(Context context) {
         tab1_new_fragment_prefs = context.getSharedPreferences("input_prefs", Context.MODE_PRIVATE);
  if (frame_size > 10.4) {
                    frame_size_result.setText(getString(R.string.frame_size_small)); **//line 279**
                    if (formula_type == 1) {
                        bmr = mainActivity_obj.one_digit((66.5 + (13.75 * weight_value) + (5.003 * height_value) - (6.755 * age_value)) * 90 / 100); 
                    } else if (formula_type == 2) {
                        bmr = mainActivity_obj.one_digit(((10 *        weight_value) + (6.25 * height_value) - (5 * age_value) + 5) * 90 / 100);
                    }
                }
        }

错误:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: mydietitian.milad, PID: 1579
              java.lang.IllegalStateException: Fragment Tab2NewFragment{3b28efa} not attached to a context.
                  at android.support.v4.app.Fragment.requireContext(Fragment.java:696)
                  at android.support.v4.app.Fragment.getResources(Fragment.java:760)
                  at android.support.v4.app.Fragment.getString(Fragment.java:782)
                  at mydietitian.milad.Tab2NewFragment.set_outputs(Tab2NewFragment.java:279)
                  at mydietitian.milad.Tab1NewFragment$11.onClick(Tab1NewFragment.java:478)
                  at android.view.View.performClick(View.java:5697)
                  at android.widget.TextView.performClick(TextView.java:10826)
                  at android.view.View$PerformClick.run(View.java:22526)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:158)
                  at android.app.ActivityThread.main(ActivityThread.java:7224)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
      I/Process: Sending signal. PID: 1579 SIG: 9
      Application terminated.

标签: androidandroid-fragmentsandroid-context

解决方案


我遇到的简单方法是

改变

getActivity().getApplicationContext();

getContext();

要了解如何有效地处理上下文,请参阅getContext() 、 getApplicationContext() 、 getBaseContext() 和“this”之间的区别


推荐阅读