2

이것은 내 첫 번째 Android-app이며 이전에는 전혀 Java 지식이 없었습니다.여러 DatePickers가 화면이 회전 할 때 닫습니다.

다음 코드 (found in another question, Adam L.)를 사용하여 28 개의 시간 지정기가 있으며 코드를 약간 변경 한 후에 잘 작동합니다.
하지만 주목할 점은 timepickerdialog (또는 여기에 표시된대로 코드를 사용할 때 datepickerdialog)에있을 때 강제로 닫히고 (nullpointerexception) 화면의 방향을 변경한다는 것입니다.
내가 onDestroy와 함께 몇 가지 정보를 저장하고 다시 onStart로 복원해야한다고 생각하지만이 작업을 수행하는 방법을 모르겠습니다.
내 자신의 코드에서 timepickerdialogs를 사용하지만 Adam L. 코드가 더 깨끗해서 문제가 해결되면 내 자신의 문제도 해결됩니다.

12-18 11:32:52.415: INFO/ActivityManager(577): Displayed activity se.bergsland.manydatepickers/.ManyDatePickers: 993 ms 
12-18 11:32:57.625: DEBUG/dalvikvm(1734): GC freed 1950 objects/104136 bytes in 192ms 
12-18 11:33:00.396: INFO/WindowManager(577): Config changed: { scale=1.0 imsi=0/0 locale=en_US touch=3 key=2/1/2 nav=3 orien=2 } 
12-18 11:33:00.535: DEBUG/StatusBar(577): updateResources 
12-18 11:33:00.595: DEBUG/AndroidRuntime(1763): Shutting down VM 
12-18 11:33:00.595: WARN/dalvikvm(1763): threadid=3: thread exiting with uncaught exception (group=0x4000fe70) 
12-18 11:33:00.605: ERROR/AndroidRuntime(1763): Uncaught handler: thread main exiting due to uncaught exception 
12-18 11:33:00.615: INFO/WindowManager(577): onOrientationChanged, rotation changed to 0 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763): java.lang.RuntimeException: Unable to start activity ComponentInfo{se.bergsland.manydatepickers/se.bergsland.manydatepickers.ManyDatePickers}: java.lang.NullPointerException 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3278) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.app.ActivityThread.access$1900(ActivityThread.java:112) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.os.Looper.loop(Looper.java:123) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.app.ActivityThread.main(ActivityThread.java:3948) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at java.lang.reflect.Method.invoke(Method.java:521) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at dalvik.system.NativeStart.main(Native Method) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763): Caused by: java.lang.NullPointerException 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at se.bergsland.manydatepickers.ManyDatePickers.onCreateDialog(ManyDatePickers.java:102) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.app.Activity.restoreManagedDialogs(Activity.java:857) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.app.Activity.performRestoreInstanceState(Activity.java:801) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1172) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2245) 
12-18 11:33:00.625: ERROR/AndroidRuntime(1763):  ... 12 more 
+0

오리엔테이션이 변경되면 createDialog가 자동으로 호출됩니다. 그러므로 문제. activeDate를 올바르게 인스턴스화하는 논리를 수정하십시오. – cx0der

+0

이 방법을 알아 내려고 노력하고 있지만이 fargaths 메서드를 사용하는 것보다 더 나은 솔루션을 것이라고? –

답변

2

사용하여 활동이 코드 :

import java.util.Calendar; 
import android.app.Activity; 
import android.app.DatePickerDialog; 
import android.app.Dialog; 
import android.app.DatePickerDialog.OnDateSetListener; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.DatePicker; 
import android.widget.TextView; 

public class MultiDatePickerActivity extends Activity { 

private TextView startDateDisplay; 
private TextView endDateDisplay; 
private Button startPickDate; 
private Button endPickDate; 
private Calendar startDate; 
private Calendar endDate; 

static final int DATE_DIALOG_ID = 0; 

private TextView activeDateDisplay; 
private Calendar activeDate; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.multidatepicker); 

    /* capture our View elements for the start date function */ 
    startDateDisplay = (TextView) findViewById(R.id.startDateDisplay); 
    startPickDate = (Button) findViewById(R.id.startPickDate); 

    /* get the current date */ 
    startDate = Calendar.getInstance(); 

    /* add a click listener to the button */ 
    startPickDate.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      showDateDialog(startDateDisplay, startDate); 
     } 
    }); 

    /* capture our View elements for the end date function */ 
    endDateDisplay = (TextView) findViewById(R.id.endDateDisplay); 
    endPickDate = (Button) findViewById(R.id.endPickDate); 

    /* get the current date */ 
    endDate = Calendar.getInstance(); 

    /* add a click listener to the button */ 
    endPickDate.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      showDateDialog(endDateDisplay, endDate); 
     } 
    }); 

    /* display the current date (this method is below) */ 
    updateDisplay(startDateDisplay, startDate); 
    updateDisplay(endDateDisplay, endDate); 
} 

private void updateDisplay(TextView dateDisplay, Calendar date) { 
    dateDisplay.setText(
      new StringBuilder() 
       // Month is 0 based so add 1 
       .append(date.get(Calendar.MONTH) + 1).append("-") 
       .append(date.get(Calendar.DAY_OF_MONTH)).append("-") 
       .append(date.get(Calendar.YEAR)).append(" ")); 

} 

public void showDateDialog(TextView dateDisplay, Calendar date) { 
    activeDateDisplay = dateDisplay; 
    activeDate = date; 
    showDialog(DATE_DIALOG_ID); 
} 

private OnDateSetListener dateSetListener = new OnDateSetListener() { 
    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     activeDate.set(Calendar.YEAR, year); 
     activeDate.set(Calendar.MONTH, monthOfYear); 
     activeDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); 
     updateDisplay(activeDateDisplay, activeDate); 
     unregisterDateDisplay(); 
    } 
}; 

private void unregisterDateDisplay() { 
    activeDateDisplay = null; 
    activeDate = null; 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
     case DATE_DIALOG_ID: 
      return new DatePickerDialog(this, dateSetListener, activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH)); 
    } 
    return null; 
} 

@Override 
protected void onPrepareDialog(int id, Dialog dialog) { 
    super.onPrepareDialog(id, dialog); 
    switch (id) { 
     case DATE_DIALOG_ID: 
      ((DatePickerDialog) dialog).updateDate(activeDate.get(Calendar.YEAR), activeDate.get(Calendar.MONTH), activeDate.get(Calendar.DAY_OF_MONTH)); 
      break; 
    } 
} 
} 

나는 이것이 이클립스에서 로그 캣의 흥미로운 부분이라고 생각

@Override 

public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
} 

사용이 매니페스트 파일 :

<activity android:name="MyActivity" android:label="@string/app_name" 
    android:configChanges="orientation|keyboardHidden"></activity> 
+0

| 일 <활동 안드로이드 : 이름 = "MyActivity"안드로이드 : 라벨 = "@ 문자열/APP_NAME" \t \t \t 안드로이드 configChanges = "방향을 keyboardHidden"> – fargath

+0

감사합니다. 이것은 활동이 결코 파괴되지 않는다는 것을 의미합니까? 그렇다면이 방법으로 그것을 푸는 부정적인 결과가 있습니까? –

1

파르 가스 ' 나는 두려워하는 것이 최선이 아니었다. 구성 변경 후 onCreateDialog()을 호출하면 activateDate이 null입니다. onClick()에 한 번만 설정 했으므로 onStart()에 설정해야합니다. onResume()으로 설정하면 작동하지 않지만 설정해야 할 수도 있습니다. 내 문제 Android lifecycle: Fill in data in activity in onStart() or onResume()?을 참조하십시오.

대화 상자가 표시되는 정확한 날짜에 날짜를 업데이트하려면 을 통해 updateDate()onPrepareDialog()에 직접 입력 할 수 있습니다.

Fargath의 솔루션에 대한 문제점은 소프트 키보드를 숨기고 있지만 G1과 같은 하드웨어 키보드가있는 장치에 여전히 문제가 있다는 것입니다. 걸려 오는 전화도 마찬가지입니다. 이 무엇을해야할지 모르겠습니다.

관련 문제