2016-06-14 83 views
0

我有一個DialogFragment用於顯示TimePickerDialog時按下button,我想將按鈕的文本更改爲新的時間設置。ANDROID - setOnDismissListener在一個DialogFragment上

我的問題是我不能在DialogFragment上撥打setOnDismissListener從我的Activity

這是我DialogDragment

public class TimePickerFragment extends DialogFragment 
     implements TimePickerDialog.OnTimeSetListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     int hour = Application.getSettings().getInt("hour", 11); 
     int minute = Application.getSettings().getInt("minute", 11); 

     // Create a new instance of TimePickerDialog and return it 
     return new TimePickerDialog(getActivity(), this, hour, minute, 
       DateFormat.is24HourFormat(getActivity())); 
    } 

    @Override 
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
     FirstTimeLaunchSettingsActivity.hours = hourOfDay; 
     FirstTimeLaunchSettingsActivity.minutes = minute; 

    } 
} 

這是我怎麼稱呼這個DialogFragment

public void showTimePickerDialog(View v) { 
    DialogFragment newFragment = new TimePickerFragment(); 
    newFragment.show(this.getFragmentManager(), "timePicker"); 
} 

我已經想在我activity製作Handler這將refreshActivity每次都是,但那不是我想解決問題的方法。

我只想當我關閉我的DialogFragment時,我的按鈕被設置爲我輸入的時間。

感謝您的幫助。

+0

[DialogFragment and onDismiss](http:// stackoverflow。com/questions/23786033/dialogfragment-and-ondismiss) –

回答

3

您可以覆蓋onDismiss(DialogInterface dialog)方法,該方法將在DialogFragment解散時調用。你也可以做到這一點,從您的活動與內聯控:

public void showTimePickerDialog(View v) { 
    DialogFragment newFragment = new TimePickerFragment() { 
     @Override 
     public void onDismiss(DialogInterface dialog){ 
      // Add your code here 
     } 
    }; 
    newFragment.show(this.getFragmentManager(), "timePicker"); 
} 
+0

謝謝,這工作得很好! – HypnoZ

+0

Android Studio給了我一個非常好的警告/錯誤:碎片應該是靜態的!否則,它們不能重複使用,例如改變方向後......這可能似乎有效,但可能會導致更多問題 – metinkale38

+0

這只是一個簡短的例子。您可以創建一個非內聯類,並以相同的方式覆蓋它。 –

0

你可以直接做你已經實現了onTimeSet方法內。你可以在TimePicker視圖被嵌入的活動和更新按鈕文本

@Override 
public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
    FirstTimeLaunchSettingsActivity.hours = hourOfDay; 
    FirstTimeLaunchSettingsActivity.minutes = minute; 

    YourActivityClass activity = (YourActivityClass) getActivity(); 
    activity.updateButton(hourOfDay + ":" + (minute<10?"0"+minute:minute)); 
} 

然後,你的活動YourActivityClass裏面,你可以更新的按鈕,像往常一樣:

public void updateButton(String newText) { 
    Button yourButton = (Button) findViewById(R.id.yourButtonID); 
    yourButton.setText(newText); 
} 
0

I can't call setOnDismissListener on the DialogFragment from my Activity.

你可以,所有你需要做的就是在你的活動中實現界面

然後讓你的活動執行OnDismissListener

public final class YourActivity extends AppCompatActivity implements DialogInterface.OnDismissListener { 

    @Override 
    public void onDismiss(final DialogInterface dialog) { 
     //Fragment dialog had been dismissed 
    } 
} 

然後只需重寫片段中的onDismiss偵聽器並調用Activity。

public final class DialogFragmentImage extends DialogFragment { 
    @Override 
    public void onDismiss(final DialogInterface dialog) { 
     super.onDismiss(dialog); 
     final Activity activity = getActivity(); 
     if (activity instanceof DialogInterface.OnDismissListener) { 
      ((DialogInterface.OnDismissListener) activity).onDismiss(dialog); 
     } 
    } 

} 
1

這裏是另一種方式來setOnDismissListener()的對話片段

FragmentManager fm = getFragmentManager(); 

YourDialogFragment dialog = new YourDialogFragment(); 
dialog.show(fm,"Dialog Name"); 

fm.executePendingTransactions(); 
dialog.getDialog().setOnDismissListener(new DialogInterface.OnDismissListener() { 
        @Override 
        public void onDismiss(DialogInterface dialogInterface) { 
         //action when dialog is dismissed goes here 
        } 
       }); 

爲了確保FragmentTransaction工作已經完成。我們需要調用

fm.executePendingTransactions(); 

否則NullPointerException可能出現調用setOnDismissListener()時。

相關問題