通过 java 在 XML 中声明的访问开关

Access switch declared in XML via java

我在 XML 中创建了一个开关。它的开关是在检查时创建的。

即使应用程序重新启动,我也得到了一个要保存的布尔值,我所需要的只是在应用程序启动时匹配布尔值的开关。我似乎不知道如何更改它。

删除 android:checked="true(or false)" 是否允许我在应用程序启动时编辑代码,还是没有关系?

我试过在 onCreate() 启动时使用 if-else 语句将开关设置到正确的位置,但这只会导致应用程序崩溃。

这是我的 XML:

<Switch
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/SwitchName"
    android:id="@+id/switch1"
    android:layout_alignBottom="@+id/dBellButton"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:clickable="true"
    android:onClick="onToggleClicked" 
    android:checked="true" />

这是我的 onCreate() 方法:

MediaPlayer dBell;
boolean vibeOn;

Switch switchConv = (Switch) findViewById(R.id.switch1);

@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.activity_main);
    dBell = MediaPlayer.create(this, R.raw.doorbell);

    SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE);
    vibeOn = pref.getBoolean("vibeRemember", true);

if (vibeOn = true) {
        switchConv.setChecked(true);
    } else {
        switchConv.setChecked(false);
    }
}

我认为 if-else 语句是导致应用程序在创建时崩溃的原因,但注释掉此块并没有解决问题。所以,我也注释掉了Switch switchConv = (Switch) findViewById(R.id.switch1);。注释掉这两个块允许代码 运行 成功。

我想知道是不是我的 findViewById 导致了问题。

是否有另一种方法可以通过我的 .java 在 XML 中引用我的开关?

谢谢!

内森

在声明元素之前需要先设置ContentView。在 setContentView 之后移动您的开关初始化。

还有 if (vibeOn = true)if (vibeOn)

它响铃了吗?您正在使用赋值运算符而不是比较器。而且布尔值也可以直接使用而无需比较器。

private Switch switchConv;
@Override
protected void onCreate(Bundle bundle) {
   super.onCreate(bundle);
setContentView(R.layout.activity_main);
switchConv = (Switch)this.findViewById(R.id.switch1);

SharedPreferences pref = this.getSharedPreferences("MyPref", MODE_PRIVATE);
switchCon.setChecked(pref.getBoolean("vibeRemember", true));
}

您不能静态声明视图,因为您还没有调用 setContentView()。设置内容视图后必须声明所有视图:

Switch switchConv;

@Override
protected void onCreate(Bundle bundle) {

    ...
    setContentView(R.layout.activity_main);
    switchConv = (Switch) findViewById(R.id.switch1);
    ...

}

试试这个:

Switch switchConv;
@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.activity_main);
    .......
    switchConv = (Switch)this.findViewById(R.id.switch1);

}

这对我有用。