设置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);