设置onSeekBarChangeListener导致空对象异常
Setting onSeekBarChangeListener causes null object exception
我正在尝试使用搜索栏的值更新文本视图,但在设置 OnSeekBarChangeListener 时遇到问题。我没有任何编译错误,但每次我尝试 运行 应用程序时,都会出现空指针异常。
错误说:
尝试在空对象引用上调用虚拟方法'void android.widget.SeekBar.setOnSeekBarChangeListener(android.widget.SeekBar$OnSeekBarChangeListener)'
尽管在 Whosebug 上进行了搜索,但我终究无法弄清楚原因。每个类似的问题或关于如何设置 OnSeekBarChangeListener 的教程似乎都建议我完全按照我所做的去做。求助!
public class MainActivity extends AppCompatActivity {
public TextView time;
public SeekBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
time = (TextView) findViewById(R.id.time);
bar = (SeekBar) findViewById(R.id.bar);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bar.setOnSeekBarChangeListener(listener);
}
private SeekBar.OnSeekBarChangeListener listener = new OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
time.setText((String.valueOf(progress/100) + ":" + String.valueOf(progress % 100)));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
};}
我会尝试设置这些行
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
首先在 onCreate 方法中,然后尝试使用
找到 seekBar 视图
bar = (SeekBar) findViewById(R.id.bar);
如果解决了您的问题,请告诉我!
findViewById() 方法将尝试查找具有指定 ID 的视图。但要做到这一点,它必须知道哪个布局文件用于 activity,以便它知道在哪里搜索。这就是你用 setContentView 指出的,这就是为什么它必须放在第一位。
将您的 onCreate
替换为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
time = (TextView) findViewById(R.id.time);
bar = (SeekBar) findViewById(R.id.bar);
bar.setOnSeekBarChangeListener(listener);
}
您应该在使用 findViewById
之前调用 setContentView()
!
当您调用错误的 activity 或当您调用正确的 activity 并调用另一个没有您想要的组件的错误 activity 时,也会发生此错误,示例
setContentView(R.layout.correct_activity_with_your_component);
some code.... setContentView(R.layout.wrong_activity_without_your_component_bar_activity_main);
bar = (SeekBar) findViewById(R.id.bar);
所以一种解决方案是编写类似于
setContentView(R.layout.correct_activity_with_your_component);
在你的组件之前验证如果没有另一个命令
类似于
setContentView(R.layout.correct_activity_with_your_component);
在调用组件之前:
bar = (SeekBar) findViewById(R.id.bar);
我正在尝试使用搜索栏的值更新文本视图,但在设置 OnSeekBarChangeListener 时遇到问题。我没有任何编译错误,但每次我尝试 运行 应用程序时,都会出现空指针异常。
错误说:
尝试在空对象引用上调用虚拟方法'void android.widget.SeekBar.setOnSeekBarChangeListener(android.widget.SeekBar$OnSeekBarChangeListener)'
尽管在 Whosebug 上进行了搜索,但我终究无法弄清楚原因。每个类似的问题或关于如何设置 OnSeekBarChangeListener 的教程似乎都建议我完全按照我所做的去做。求助!
public class MainActivity extends AppCompatActivity {
public TextView time;
public SeekBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
time = (TextView) findViewById(R.id.time);
bar = (SeekBar) findViewById(R.id.bar);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bar.setOnSeekBarChangeListener(listener);
}
private SeekBar.OnSeekBarChangeListener listener = new OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
time.setText((String.valueOf(progress/100) + ":" + String.valueOf(progress % 100)));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
};}
我会尝试设置这些行
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
首先在 onCreate 方法中,然后尝试使用
找到 seekBar 视图bar = (SeekBar) findViewById(R.id.bar);
如果解决了您的问题,请告诉我!
findViewById() 方法将尝试查找具有指定 ID 的视图。但要做到这一点,它必须知道哪个布局文件用于 activity,以便它知道在哪里搜索。这就是你用 setContentView 指出的,这就是为什么它必须放在第一位。
将您的 onCreate
替换为:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
time = (TextView) findViewById(R.id.time);
bar = (SeekBar) findViewById(R.id.bar);
bar.setOnSeekBarChangeListener(listener);
}
您应该在使用 findViewById
之前调用 setContentView()
!
当您调用错误的 activity 或当您调用正确的 activity 并调用另一个没有您想要的组件的错误 activity 时,也会发生此错误,示例
setContentView(R.layout.correct_activity_with_your_component);
some code.... setContentView(R.layout.wrong_activity_without_your_component_bar_activity_main);
bar = (SeekBar) findViewById(R.id.bar);
所以一种解决方案是编写类似于 setContentView(R.layout.correct_activity_with_your_component); 在你的组件之前验证如果没有另一个命令 类似于
setContentView(R.layout.correct_activity_with_your_component);
在调用组件之前:
bar = (SeekBar) findViewById(R.id.bar);