我目前正努力学习Java& Android,我遇到了一个我根本无法解决的问题。
这是班级:
public class Lock extends Fragment implements OnClickListener {
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
int mBluetoothState = 0;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.lock, container, false);
ImageView mBluetoothImage = (ImageView)rootView.findViewById(R.id.BluetoothIcon);
TextView mBluetoothText = (TextView)rootView.findViewById(R.id.BluetoothText);
if (mBluetoothAdapter == null) {
// Add popup later - your device doesn't support bluetooth
mBluetoothImage.setImageResource(R.drawable.bluetooth_icon);
mBluetoothText.setTextColor(getResources().getColor(R.color.blue1));
mBluetoothState = 0;
}
else {
if (!mBluetoothAdapter.isEnabled()) {
// Device supports bluetooth, enable.
mBluetoothImage.setImageResource(R.drawable.bluetooth_icon2);
mBluetoothState = 1;
}
else {
// Bluetooth is enabled, disable.
mBluetoothImage.setImageResource(R.drawable.bluetooth_icon3);
mBluetoothText.setTextColor(getResources().getColor(R.color.blue1));
mBluetoothState = 2;
}
}
mBluetoothImage.setOnClickListener(this);
return rootView;
}
@Override
public void onClick(View v) {
ImageView mBluetoothImage = (ImageView)v.findViewById(R.id.BluetoothIcon);
TextView mBluetoothText = (TextView)v.findViewById(R.id.BluetoothText);
if (mBluetoothState == 0) {
// Add popup later - your device doesn't support bluetooth
mBluetoothText.setTextColor(getResources().getColor(R.color.red1));
}
else if (mBluetoothState == 1) {
// Device supports bluetooth, enable.
mBluetoothAdapter.enable();
mBluetoothState = 2;
mBluetoothImage.setImageResource(R.drawable.bluetooth_icon3);
mBluetoothText.setTextColor(getResources().getColor(R.color.blue1));
}
else {
// Bluetooth is enabled, disable.
mBluetoothAdapter.disable();
mBluetoothState = 1;
mBluetoothImage.setImageResource(R.drawable.bluetooth_icon2);
mBluetoothText.setTextColor(getResources().getColor(R.color.gray1));
}
}
}
在OnCreateView方法中,mBluetoothImage和mBluetoothText都会发生变化,在onClick方法中,mBluetoothImage会发生变化。
但是mBluetoothText会在第60,69或74行引发错误,具体取决于mBluetoothState。
mBluetoothText.setTextColor(getResources().getColor(R.color.red1));
mBluetoothText.setTextColor(getResources().getColor(R.color.blue1));
mBluetoothText.setTextColor(getResources().getColor(R.color.gray1));
我不明白的是onCreateView有效,但它没有onClick,而且它只是不起作用的文本,你们可以帮忙吗? / p>
编辑 - 这是错误日志:
11-04 14:26:06.618: W/dalvikvm(7959): threadid=1: thread exiting with uncaught exception (group=0x415cece0)
11-04 14:26:06.618: E/AndroidRuntime(7959): FATAL EXCEPTION: main
11-04 14:26:06.618: E/AndroidRuntime(7959): Process: com.example.bikey, PID: 7959
11-04 14:26:06.618: E/AndroidRuntime(7959): java.lang.NullPointerException
11-04 14:26:06.618: E/AndroidRuntime(7959): at com.example.bikey.Lock.onClick(Lock.java:74)
11-04 14:26:06.618: E/AndroidRuntime(7959): at android.view.View.performClick(View.java:4438)
11-04 14:26:06.618: E/AndroidRuntime(7959): at android.view.View$PerformClick.run(View.java:18439)
11-04 14:26:06.618: E/AndroidRuntime(7959): at android.os.Handler.handleCallback(Handler.java:733)
11-04 14:26:06.618: E/AndroidRuntime(7959): at android.os.Handler.dispatchMessage(Handler.java:95)
11-04 14:26:06.618: E/AndroidRuntime(7959): at android.os.Looper.loop(Looper.java:136)
11-04 14:26:06.618: E/AndroidRuntime(7959): at android.app.ActivityThread.main(ActivityThread.java:5153)
11-04 14:26:06.618: E/AndroidRuntime(7959): at java.lang.reflect.Method.invokeNative(Native Method)
11-04 14:26:06.618: E/AndroidRuntime(7959): at java.lang.reflect.Method.invoke(Method.java:515)
11-04 14:26:06.618: E/AndroidRuntime(7959): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
11-04 14:26:06.618: E/AndroidRuntime(7959): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
11-04 14:26:06.618: E/AndroidRuntime(7959): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:0)
在onClick()
中,您在点击的findViewById()
视图上呼叫v
。您尝试查找的视图不是所点击视图的子视图,并且会返回null
。
将mBluetoothImage
和mBluetoothText
作为成员变量移动到您的片段中,将其初始化为onCreateView()
并在onClick()
中使用。
例如:
private ImageView mBluetoothImage;
private TextView mBluetoothText;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.lock, container, false);
mBluetoothImage = (ImageView)rootView.findViewById(R.id.BluetoothIcon);
mBluetoothText = (TextView)rootView.findViewById(R.id.BluetoothText);
...并删除findViewById()
中的onClick()
初始化。