【问题标题】:Android: Finding a view by Id without clicking on UI buttonAndroid:在不点击 UI 按钮的情况下按 ID 查找视图
【发布时间】:2014-03-17 17:30:37
【问题描述】:

Android 编程新手,请多多包涵。

我正在尝试打开一个设置活动(使用共享首选项)并使用 Checkboxes 填充它,这取决于主活动中的当前设置。

只要我在我的 Settings Activity UI 上放置一个按钮,该按钮调用该方法来显示 Checkboxes 当前的状态,我就可以让它工作。

如果我尝试从 onCreate 方法自动调用 "settingsLoadSavedSettings" 方法,它不会让我传递 (View view) 参数并且没有参数,应用程序会立即崩溃尝试运行.isChecked(true) 代码行,我认为是因为没有参数它无法通过Id 找到Checkbox

如果我注释掉 .isChecked(true) 行,则程序可以正常工作,只要 Shared Preferences 正在更新,并且如果我单击复选框,主应用程序活动会正确响应,但 Checkboxes无论启动时的主要应用程序设置如何,都未选中设置 UI。

除了我必须在加载活动后单击设置 UI 上的“显示当前设置”按钮以显示复选框的当前状态外,它工作正常。我正在尝试在活动屏幕打开后自动填充复选框状态。

我在onCreate 方法中留下了注释掉的调用,但我不能将View 视图作为参数放入而不会出现错误“无法解析符号'视图'”。同样, settingsLoadSavedSettings 方法在通过设置活动 UI 上的按钮调用并且没有查看视图参数时有效,当我尝试打开设置活动时应用会崩溃。

非常感谢您提供的任何帮助。我希望这是我不了解面向对象编程并犯了愚蠢错误的简单案例。我试过搜索这个,但我认为这个问题太笼统了,以至于我的搜索词给了我很多答案

部分代码:

public class SettingsActivity extends ActionBarActivity {
CheckBox AllowAddition, AllowSubtraction, AllowMultiplication, AllowDivision;
boolean settingAddition, settingSubtraction, settingMultipliation, settingDivision;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    if (savedInstanceState == null) {
         getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }
    //settingsLoadSavedSettings(View view);
}
public void settingsLoadSavedSettings(View view){
    AllowAddition = (CheckBox) findViewById(R.id.allowAddition);
    AllowSubtraction = (CheckBox) findViewById(R.id.allowSubtraction);
    AllowMultiplication = (CheckBox) findViewById(R.id.allowMultiplication);
    AllowDivision = (CheckBox) findViewById(R.id.allowDivision);
    SharedPreferences sharedPreferences =   PreferenceManager.getDefaultSharedPreferences(this);
    settingAddition = sharedPreferences.getBoolean("Allow_Addition",true);
    settingSubtraction = sharedPreferences.getBoolean("Allow_Subtraction",true);
    settingMultipliation = sharedPreferences.getBoolean("Allow_Multiplication",true);
    settingDivision = sharedPreferences.getBoolean("Allow_Division",true);
    if (settingAddition){
        AllowAddition.setChecked(true);
    }
    if (settingSubtraction){
        AllowSubtraction.setChecked(true);
       }
    if (settingMultipliation){
        AllowMultiplication.setChecked(true);
    }
    if (settingDivision){
        AllowDivision.setChecked(true);
    }

}

使用 onCreate 中的方法调用激活设置活动时的错误日志:

02-18 20:55:13.916  24918-24918/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity      ComponentInfo{com.example.mathhelper/com.example.mathhelper.SettingsActivity}:   java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
        at android.app.ActivityThread.access$700(ActivityThread.java:159)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5419)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)

【问题讨论】:

  • 保持描述简短易懂,让您的问题简单易懂。
  • 我没有看到你在任何地方使用 view 参数,那么为什么这必须与崩溃有关呢?此外,必须发布崩溃日志。
  • 添加崩溃日志(空指针异常)。
  • 问题是:为什么从 UI 上的按钮调用复选框时会正确更新,但在 onCreate 方法结束时调用相同的方法时应用会崩溃?

标签: android android-layout checkbox view


【解决方案1】:

你让这种方式变得比它需要的更难-查找PreferenceActivity,它会为你做到这一点。

【讨论】:

  • 感谢您向我指出这一点,我没有偶然发现这一点,它可能会为我节省一些悲伤。
【解决方案2】:

想通了。

问题是我在 onCreate 完成之前调用了 .setChecked 方法,这导致了空指针错误。通过将方法调用添加到新的 onStart 函数,现在可以设置复选框。

@Override
    protected void onStart(){
    super.onStart();
    settingsLoadSavedSettings();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2020-01-11
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    相关资源
    最近更新 更多