设置文本颜色onCreateView可以工作但不能onClick

时间:2014-11-04 13:21:29

标签: android nullpointerexception textview

我目前正努力学习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)

1 个答案:

答案 0 :(得分:0)

onClick()中,您在点击的findViewById()视图上呼叫v。您尝试查找的视图不是所点击视图的子视图,并且会返回null

mBluetoothImagemBluetoothText作为成员变量移动到您的片段中,将其初始化为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()初始化。