Java 我应该在哪里初始化我的开关小部件

Java 我应该在哪里初始化我的开关小部件,java,android,Java,Android,我的应用程序中有一个选项菜单,其中我有一个选项,可以打开一个对话框,其中包含一些小部件。我不知道应该在哪里初始化我的小部件,这样它就不会出现空指针异常 我应该将开关sw=findViewById(R.id.switch1)放在哪里,以便在对话框打开之前使用sw.setChecked() MainActivity.java: package.com.example //进口 公共类MainActivity扩展了活动 { @凌驾 创建时受保护的void(Bundle savedInstanceSt

我的应用程序中有一个选项菜单,其中我有一个选项,可以打开一个对话框,其中包含一些小部件。我不知道应该在哪里初始化我的小部件,这样它就不会出现空指针异常

我应该将开关sw=findViewById(R.id.switch1)放在哪里,以便在对话框打开之前使用
sw.setChecked()

MainActivity.java:

package.com.example
//进口
公共类MainActivity扩展了活动
{ 
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@凌驾
公共布尔onCreateOptions菜单(菜单)
{
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。主菜单,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项)
{
开关(item.getItemId())
{
案例R.id.选项:
sw.setChecked(真);
Dialog=新建对话框(此对话框);
setContentView(R.layout.dialog);
dialog.show();
违约:
返回false;
}
}
调用sw.setChecked inside OnCreate()时的错误日志

-04 16:38:48.358 2395 2395 E AndroidRuntime致命异常:main
09-04 16:38:48.358 2395 2395 E AndroidRuntime进程:com.PjMathematician.ImgMath,PID:2395
09-04 16:38:48.358 2395 2395 E AndroidRuntime java.lang.RuntimeException:无法实例化活动组件信息{com.PjMathematician.ImgMath/com.PjMathematician.ImgMath.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法'android.view.view android.view.Window.findviewbyd(int)'在空对象引用上
09-04 16:38:48.358 2395 2395 E AndroidRuntime在android.app.ActivityThread.performLaunchActivity上(ActivityThread.java:2855)
09-04 16:38:48.358 2395 2395 E AndroidRuntime在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3093)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
09-04 16:38:48.358 2395 2395 E AndroidRuntime在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于android.os.Handler.dispatchMessage(Handler.java:106)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于android.os.Looper.loop(Looper.java:193)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于android.app.ActivityThread.main(ActivityThread.java:6865)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于java.lang.reflect.Method.invoke(本机方法)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:504)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
09-04 16:38:48.358 2395 2395 E AndroidRuntime由以下原因引起:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.view.view android.view.Window.findViewById(int)”
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于android.app.Activity.findViewById(Activity.java:4125)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于com.PjMathematician.ImgMath.MainActivity。(MainActivity.java:307)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于java.lang.Class.newInstance(本机方法)
09-04 16:38:48.358 2395 2395 E AndroidRuntime位于android.app.AppComponentFactory.InstanceActivity(AppComponentFactory.java:69)
09-04 16:38:48.358 2395 2395 E AndroidRuntime在android.app.Instrumentation.newActivity(Instrumentation.java:1231)上
09-04 16:38:48.358 2395 2395 E AndroidRuntime在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2842)
09-04 16:38:48.358 2395 2395 E AndroidRuntime…11更多
当我注释掉sw.setChecked(true)语句时,此错误消失。

您应该这样做

主要活动

 package com.example
//imports
public class MainActivity extends Activity 
{ 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //initialize the switch here
        Switch sw = findViewById(R.id.switch1);
        if(sharedPreferenceObj == your logic){
          //your business logic here
        }else{
          //if condition is false then do stuff here
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
    
        switch (item.getItemId())
        {
            case R.id.option:
                sw.setChecked(true);
                Dialog dialog = new Dialog(this);
                dialog.setContentView(R.layout.dialog);
                dialog.show();
            
            default:
                return false;
        }
    }

我认为这是可行的,因为Switch视图在对话框中,所以应该使用dialog.findviewbyd(R.id.switch1)获取其实例

package.com.example
//进口
公共类MainActivity扩展了活动
{ 
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@凌驾
公共布尔onCreateOptions菜单(菜单)
{
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。主菜单,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项)
{
开关(item.getItemId())
{
案例R.id.选项:
sw.setChecked(真);
迪亚洛
 package com.example
//imports
public class MainActivity extends Activity 
{ 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //initialize the switch here
        Switch sw = findViewById(R.id.switch1);
        if(sharedPreferenceObj == your logic){
          //your business logic here
        }else{
          //if condition is false then do stuff here
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
    
        switch (item.getItemId())
        {
            case R.id.option:
                sw.setChecked(true);
                Dialog dialog = new Dialog(this);
                dialog.setContentView(R.layout.dialog);
                dialog.show();
            
            default:
                return false;
        }
    }