Java 片段和主活动之间的nullPointerException,android/android studio
我想在片段和主活动之间进行通信,因此我需要获取Java 片段和主活动之间的nullPointerException,android/android studio,java,android,nullpointerexception,Java,Android,Nullpointerexception,我想在片段和主活动之间进行通信,因此我需要获取开关。ischecked但获取: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.view.view android.app.Activity.findViewById(int)” MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void
开关。ischecked
但获取:
java.lang.NullPointerException
:尝试在空对象引用上调用虚拟方法“android.view.view android.app.Activity.findViewById(int)”
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotesFragment()).commit();
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
final NotesFragment notesFragment = new NotesFragment();
final RemindersFragment remindersFragment = new RemindersFragment();
final SettingsFragment settingsFragment = new SettingsFragment();
final Switch aSwitch = settingsFragment.getView().findViewById(R.id.switch_pop_up);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
Fragment selectedFragment = null;
switch (menuItem.getItemId()) {
case R.id.action_notes:
if(aSwitch.isChecked())
Toast.makeText(MainActivity.this, "Your Notes", Toast.LENGTH_SHORT).show();
selectedFragment = notesFragment;
break;
case R.id.action_reminders:
if(aSwitch.isChecked())
Toast.makeText(MainActivity.this, "Your Reminders", Toast.LENGTH_SHORT).show();
selectedFragment = remindersFragment;
break;
case R.id.action_settings:
if(aSwitch.isChecked())
Toast.makeText(MainActivity.this, "Settings", Toast.LENGTH_SHORT).show();
selectedFragment = settingsFragment;
break;
}
assert selectedFragment != null;
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
selectedFragment).commit();
return true;
}
});
}
}
public class SettingsFragment extends Fragment {
Switch switch_pop_up;
boolean stateSwitchPopUp;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_settings, null);
switch_pop_up = v.findViewById(R.id.switch_pop_up);
return inflater.inflate(R.layout.fragment_settings,container,false);
}
}
设置片段.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new NotesFragment()).commit();
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
final NotesFragment notesFragment = new NotesFragment();
final RemindersFragment remindersFragment = new RemindersFragment();
final SettingsFragment settingsFragment = new SettingsFragment();
final Switch aSwitch = settingsFragment.getView().findViewById(R.id.switch_pop_up);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
Fragment selectedFragment = null;
switch (menuItem.getItemId()) {
case R.id.action_notes:
if(aSwitch.isChecked())
Toast.makeText(MainActivity.this, "Your Notes", Toast.LENGTH_SHORT).show();
selectedFragment = notesFragment;
break;
case R.id.action_reminders:
if(aSwitch.isChecked())
Toast.makeText(MainActivity.this, "Your Reminders", Toast.LENGTH_SHORT).show();
selectedFragment = remindersFragment;
break;
case R.id.action_settings:
if(aSwitch.isChecked())
Toast.makeText(MainActivity.this, "Settings", Toast.LENGTH_SHORT).show();
selectedFragment = settingsFragment;
break;
}
assert selectedFragment != null;
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
selectedFragment).commit();
return true;
}
});
}
}
public class SettingsFragment extends Fragment {
Switch switch_pop_up;
boolean stateSwitchPopUp;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_settings, null);
switch_pop_up = v.findViewById(R.id.switch_pop_up);
return inflater.inflate(R.layout.fragment_settings,container,false);
}
}
我认为这是因为:
final Switch aSwitch = settingsFragment.getView().findViewById(R.id.switch_pop_up);
如何修复此问题?在片段上,在
onCreateView
方法中,更改此行:
View v = inflater.inflate(R.layout.fragment_settings, null);
final Switch aSwitch = settingsFragment.getView().findViewById(R.id.switch_pop_up);
进入:
编辑1:
发生这种情况是因为您正在执行v.findViewById()
,但在onCreateView()上没有返回v
将片段中的return
行更改为returnv代码>
编辑2:
将片段上的getter添加到弹出的开关中
:
public Switch getSwitchPopUp() {
return switch_pop_up;
}
在您的活动中,替换此行:
View v = inflater.inflate(R.layout.fragment_settings, null);
final Switch aSwitch = settingsFragment.getView().findViewById(R.id.switch_pop_up);
与:
在这条线之前,你得给你的装置充气
注意:无论您需要哪种结果,这都不是一个好方法,因此您可能需要寻找其他方法来实现它。问题是:
您没有将设置片段
附加到“活动”以使其在屏幕上可见(就像您对注释片段
所做的那样)
您正试图从MainActivity
的onCreate
方法访问它的子视图李>
片段在创建活动并准备好托管它们之后初始化。因此,settingsFragment.getView()
返回null。还没有调用生命周期方法
您需要重新考虑您的方法,并尝试找到其他解决方案。我建议你仔细阅读这篇文章,以便对如何解决你的问题有更多的想法
不能将其设为空,只能设为假和真,尝试设为假,一切都与以前一样:(当您尝试使用充气器。充气时会发生什么情况(R.layout.fragment\u设置,容器,假)
?请参见编辑:好的,我这样做了,但是idk为什么也会使用NullPointerException崩溃:尝试在null对象引用上调用虚拟方法“android.view.view.findViewById(int)”,这是因为您正在执行v.findViewById()
,但在onCreateView()上没有返回v
。将片段中的返回…
行更改为返回v;