android - 片段 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.
解决方案
我遇到的简单方法是
改变
getActivity().getApplicationContext();
至
getContext();
要了解如何有效地处理上下文,请参阅getContext() 、 getApplicationContext() 、 getBaseContext() 和“this”之间的区别
推荐阅读
- arduino - 即使引脚接地,analogRead() 输出也会振荡
- javascript - php和javascript执行嵌套函数的区别
- scala - 将 \/[A, B] 提升为 EitherT[Future, A, B]
- erlang - gen_server:reply/2: 发送给客户端的消息格式
- html - 使用自动填充创建自定义输入框
- javascript - 如何自动调用 RESTful Web 服务
- python - 如何从彭博 API 中获取有关特定证券(股票)和日期范围的新闻?
- java - 在通过android上传之前是否可以降低视频文件的质量?
- javascript - 当发生另一个交互时,Javascript 函数停止执行
- android - 如何修复:Android Api 28 DisplayManager#getDisplays() 函数使应用程序崩溃