Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从同一活动中按钮的onClick方法获取Datepicker对象_Java_Android_Datepicker - Fatal编程技术网

Java 无法从同一活动中按钮的onClick方法获取Datepicker对象

Java 无法从同一活动中按钮的onClick方法获取Datepicker对象,java,android,datepicker,Java,Android,Datepicker,嗨,我得到一个NPE java.lang.IllegalStateException: Could not execute method of the activity at android.view.View$1.onClick(View.java:3100) at android.view.View.performClick(View.java:3627) at android.view.View$PerformClick.run(View.java:14304)

嗨,我得到一个NPE

java.lang.IllegalStateException: Could not execute method of the activity
    at android.view.View$1.onClick(View.java:3100)
    at android.view.View.performClick(View.java:3627)
    at android.view.View$PerformClick.run(View.java:14304)
    at android.os.Handler.handleCallback(Handler.java:605)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4512)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:984)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at android.view.View$1.onClick(View.java:3095)
    ... 11 more
Caused by: java.lang.NullPointerException
    at com.rkapps.calendarsharing.SyncToCloudActivity.getDateFromDatePicket(SyncToCloudActivity.java:59)
    at com.rkapps.calendarsharing.SyncToCloudActivity.syncWithCloud(SyncToCloudActivity.java:47)
从下面的代码

package com.rkapps.calendarsharing;

import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.DatePicker;

import com.rkapps.calendarsharing.events.Synchronizer;

public class SyncToCloudActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sync_to_cloud);
        DatePicker startDatePicker = (DatePicker) findViewById(R.id.datePicker1);
        DatePicker endDatePicker = (DatePicker) findViewById(R.id.datePicker2);
        setNormnalCalendar(startDatePicker);
        setNormnalCalendar(endDatePicker);
    }

    private void setNormnalCalendar(DatePicker startDatePicker) {
        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        if (currentapiVersion >= 11) {
              try {
                Method m = startDatePicker.getClass().getMethod("setCalendarViewShown", boolean.class);
                m.invoke(startDatePicker, false);
              }
              catch (Exception e) {} // eat exception in our case
            }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_sync_to_cloud, menu);
        return true;
    }

    public void syncWithCloud(View view) {
        DatePicker startDatePicker = (DatePicker) view.findViewById(R.id.datePicker1);
        Date startDate = getDateFromDatePicket(startDatePicker);
        DatePicker endDatePicker = (DatePicker) view.findViewById(R.id.datePicker2);
        Date endDate = getDateFromDatePicket(endDatePicker);
        new Synchronizer(getContentResolver(), this).syncToCloud(startDate ,endDate);
    }

    /**
     * 
     * @param datePicker
     * @return a java.util.Date
     */
    public static java.util.Date getDateFromDatePicket(DatePicker datePicker) {
        int day = datePicker.getDayOfMonth();
        int month = datePicker.getMonth();
        int year = datePicker.getYear();

        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month, day);

        return calendar.getTime();
    }

}
NPE来自我试图从syncWithCloud()访问我的日期选择器的那一行-当按下同一活动中的按钮时调用该方法

我从android froums上读到,我应该使用DialogFragmnet来使用这个日期选择器。但是,由于我希望我的应用程序支持android 2.3,并且不想涉及到supoprt库的复杂版本控制,所以我选择不使用对话框片段,我是否可以使用日期选择器?提前谢谢

活动xml如图所示

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/start_date" />

        <DatePicker
            android:id="@+id/datePicker1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/end_date" />

        <DatePicker
            android:id="@+id/datePicker2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/sync_to_cloud" 
        android:onClick="syncWithCloud"/>

</LinearLayout>


既然onCreate似乎可以找到日期选择器,为什么不在活动中保留对它们的引用,并在syncWithCloud方法中使用该引用,而不是尝试在视图中再次找到它们。感谢brianestey,我通过起诉findByviewId()而不是view.findByviewId()解决了这个问题我不知道确切的区别是什么。啊-好的捕获!传递到onClick的视图是实际单击的按钮,而不是整个xml的线性布局。谢谢brianestey:)