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;