Фрагмент Tab2NewFragment не привязан к контексту - PullRequest
0 голосов
/ 24 октября 2018

В одном из моих фрагментов навигационной панели (NewFragment) есть 3 вкладки (Tab1NewFragment, Tab2NewFragment, Tab3NewFragment), когда при нажатии кнопки в Tab1NewFragment (btn_calculate) в Tab2NewFragment вызывается метод (set_outputs).Однако это говорит фрагмент, не связанный с контекстом.В чем проблема?

* Кстати, причина, по которой я отправляю активность, когда вызываю метод set_outputs (tab2NewFragment_obj.set_outputs (getActivity ());), заключается в том, что когда я пытался получить активность из самого Tab2Newfragment,он выдал NullPointerException, но это решило его.

MainActivity:

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) {

        }
    });

Tab1NewFragment:

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.

1 Ответ

0 голосов
/ 03 мая 2019

Простой подход, с которым я столкнулся, состоит в том, чтобы

Изменить

getActivity().getApplicationContext();

На

getContext();

Чтобы понять, как эффективно работать с контекстом, пожалуйста, обратитесь к Разница между getContext (), getApplicationContext (), getBaseContext () и "this"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...