Reputation: 23
I'm currently working on converting an Activity into a Fragment. The activity contains a Edittext that when clicked shows a DialogFragmment for picking a date. In the Activity I would simply call this to show the dialog:
@SuppressLint("NewApi")
public void showDatePickerDialog(View v) {
DatePickerFragment newFragment = new DatePickerFragment(datePickerEditText);
newFragment.show(getFragmentManager(), "datePicker");
}
However this doesn't seem to work to show the dialog from a Fragment. I'm getting an error on the "show" method. So to be clear I was wondering how to show a DialogFragment from a Fragment?
This is the code for the DialogFragment
public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {
public EditText activity_edittext;
@SuppressLint("ValidFragment")
public DatePickerFragment(EditText edit_text) {
activity_edittext = edit_text;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
activity_edittext.setText(String.valueOf(day ) + "/" + String.valueOf(month + 1) + "/" + String.valueOf(year));
}
}
Upvotes: 2
Views: 2809
Reputation: 423
Your code work for me, no error on show method. Check whether import correct libraries (for example android.support.v4.app.* if you use Support Library).
EDIT - full source code:
activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
MainActivity.java
package com.viduka.stackoverflow;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.container, new AFragment());
ft.commit();
}
}
AFragment.java - from which DatePickerFragment is called
package com.viduka.stackoverflow;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.View;
import android.widget.EditText;
public class AFragment extends Fragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
showDatePickerDialog(new EditText(getActivity()));
}
public void showDatePickerDialog(View v) {
DatePickerFragment newFragment = new DatePickerFragment(new EditText(getActivity()));
newFragment.show(getFragmentManager(), "datePicker");
}
}
DatePickerFragment.java
package com.viduka.stackoverflow;
import java.util.Calendar;
import android.annotation.SuppressLint;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.DatePicker;
import android.widget.EditText;
@SuppressLint("ValidFragment")
public class DatePickerFragment extends DialogFragment implements
DatePickerDialog.OnDateSetListener {
public EditText activity_edittext;
public DatePickerFragment(EditText edit_text) {
activity_edittext = edit_text;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
final Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
activity_edittext.setText(String.valueOf(day) + "/"
+ String.valueOf(month + 1) + "/" + String.valueOf(year));
}
}
Upvotes: 1
Reputation: 874
I developed an example using your code, changing the inheritance relationship to FragmentActivity and works fine. Try this:
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) this.findViewById(R.id.activity_edittext);
editText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showDatePickerDialog();
}
});
}
public void showDatePickerDialog() {
DatePickerFragment newFragment = new DatePickerFragment(editText);
newFragment.show(getSupportFragmentManager(), "datePicker");
}
The layout used:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<EditText android:id="@+id/activity_edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"/>
</LinearLayout>
Upvotes: 1