【发布时间】:2020-07-01 00:34:05
【问题描述】:
我是使用片段的新手,我正在尝试从我的主要活动中执行片段方法,该方法比较一个文本视图,然后删除 cookie 并加载一个网站。
这就是我所拥有的:
在 MainActivity 中:
NavigatorFragment navigator = new NavigatorFragment();
navigator.refresh();
在片段中:
public void refresh(){
if (!textView.getText().toString().equals("Click HERE")){
cookieManager.removeAllCookie();
cookieManager.removeSessionCookie();
myWebView.loadUrl(URL);
}
}
结果: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.CharSequence android.widget.TextView.getText()”
编辑
抱歉,但忘记提及,虽然片段启动时发生同样的事情,但我之前使用此代码来防止我的片段重新启动:link 所以当我按下我的 BottomNavigationView 的 item4 时,它会在 onCreateView 中打开片段:
textView = root.findViewById(R.id.textView);
当我再次按下它时(没有更改片段)是我想要执行该方法的时候
我再说一遍,当我第一次按下第 4 项 BottomNavigationView 时,它会打开 Fragment 4 并加载其元素,当我第二次按下第 4 项(没有更改片段)时,我希望该方法运行
主要活动:
public class MainActivity extends AppCompatActivity {
/*
Fragment MyFragment;
private NavController navController;
*/
NavigatorFragment navigator = new NavigatorFragment();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.nav_view);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
replace_fragment(new HomeFragment());
}
private void replace_fragment(Fragment fragment) {
String tag = fragment.getClass().getSimpleName();
FragmentTransaction tr = getSupportFragmentManager().beginTransaction();
Fragment curFrag = getSupportFragmentManager().getPrimaryNavigationFragment();
Fragment cacheFrag = getSupportFragmentManager().findFragmentByTag(tag);
if (curFrag != null)
tr.hide(curFrag);
if (cacheFrag == null) {
tr.add(R.id.nav_host_fragment, fragment, tag);
} else {
tr.show(cacheFrag);
fragment = cacheFrag;
}
tr.setPrimaryNavigationFragment(fragment);
tr.commit();
}
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
replace_fragment(new HomeFragment());
if (!getSupportActionBar().isShowing()){
showBar();
}
return true;
case R.id.navigation_schedule:
replace_fragment(new ScheduleFragment());
if (!getSupportActionBar().isShowing()){
showBar();
}
return true;
case R.id.navigation_calculators:
replace_fragment(new CalculatorsFragment());
if (!getSupportActionBar().isShowing()){
showBar();
}
return true;
case R.id.navigation_navigator:
replace_fragment(new NavigatorFragment());
if (!getSupportActionBar().isShowing()){
navigator.refresh();//**************PROBLEM HERE******************************************
}
hideBar();
return true;
}
return false;
}
};
public void hideBar(){
if (Build.VERSION.SDK_INT >= 19) {
// Call some material design APIs here
Objects.requireNonNull(getSupportActionBar()).hide();
}
else {
// Implement this feature without material design
getSupportActionBar().hide();
}
}
public void showBar(){
if (Build.VERSION.SDK_INT >= 19) {
// Call some material design APIs here
Objects.requireNonNull(getSupportActionBar()).show();
}
else {
// Implement this feature without material design
getSupportActionBar().show();
}
}
}
**如果从片段代码运行,刷新方法有效
【问题讨论】:
-
你能说明
textView是如何(应该是)初始化的吗?目前这里还不够调试。 -
完成,我更新了问题希望你能帮助我,谢谢@RyanM
-
我基本同意 Zain 的回答。你可能还有一个问题是你没有在
replace_fragment中设置navigator,所以你使用的是一个尚未启动的片段而不是已经启动的片段。 -
非常感谢,我会继续测试,希望能解决