How to create DialogFragment with its mark
-
Hello! I'm writing a timer training program. And I want to spend time for the timer through the dialogue window. I read the official documentation, but I can't do what I want. Is it a standard way to set minutes and seconds instead of hours and minutes? I created my note for the Fragmet dialogue with two NumberPicker.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:orientation="horizontal">
<NumberPicker android:id="@+id/numberPickerMin" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="10dp"/> <NumberPicker android:id="@+id/numberPickerSec" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp"/>
</LinearLayout>
And created the DialogFragment class.
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;public class MyDialogFragment extends DialogFragment {
// Объявил переменный для работы с пикерами и View, который потом подключу к AlertDialog
private NumberPicker mNumberPickerMin;
private NumberPicker mNumberPickerSec;
private View mView;// Выполнил все необходимые действия с пикерами в onCreateView
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.dialog_set_timer, null);mNumberPickerMin = (NumberPicker)mView.findViewById(R.id.numberPickerMin); mNumberPickerSec = (NumberPicker)mView.findViewById(R.id.numberPickerSec); mNumberPickerMin.setMaxValue(60); mNumberPickerMin.setMinValue(0); mNumberPickerMin.setOnValueChangedListener(this); mNumberPickerSec.setMaxValue(60); mNumberPickerSec.setMinValue(0); mNumberPickerMin.setOnValueChangedListener(this); return mView;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Временно закомментировал строку
//LayoutInflater inflater = getActivity().getLayoutInflater();
builder.setTitle("Set time")
// Передаю в метод setView() созданный объект mView, в котором
// сделал все необходимые действия с пикерами
.setView(mView)
.setPositiveButton("Set", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// код для передачи данных
dialog.cancel();
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
return builder.create();
}
}@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
// код для пикеров
}
The project is launched in the emulsion, but when the dialogue is called, the programme closes with a mistake:
FATAL EXCEPTION: main
Process: com.example.grina.dialogfragment2, PID: 2026
android.util.AndroidRuntimeException: Window feature must be requested before adding content
at android.support.v7.app.AppCompatDelegateImplV7.throwFeatureRequestIfSubDecorInstalled(AppCompatDelegateImplV7.java:1636)
at android.support.v7.app.AppCompatDelegateImplV7.requestWindowFeature(AppCompatDelegateImplV7.java:546)
at android.support.v7.app.AppCompatDialog.supportRequestWindowFeature(AppCompatDialog.java:127)
at android.support.v7.app.AlertController.installContent(AlertController.java:211)
at android.support.v7.app.AlertDialog.onCreate(AlertDialog.java:240)
at android.app.Dialog.dispatchOnCreate(Dialog.java:373)
at android.app.Dialog.show(Dialog.java:274)
at android.support.v4.app.DialogFragment.onStart(DialogFragment.java:406)
at android.support.v4.app.Fragment.performStart(Fragment.java:1986)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1102)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Maybe we should just work with the class a fragment dialogue, just following the DialogFragment class? I tried that, but then there's no dialogue window buttons, and my buttons look ugly. Well, I'll be very grateful if anyone can help.
-
About the launch. It's not clear what the problem is.
getActivity()
♪ If you're trying to run your code into the designer, it's wrong. We need to build.MyDialogFragment
at the request of the user (click or anything). Then,getActivity()
He'll return what's needed and make it all right.Initiated pickers. Create the content of the dialogue separately and initiate it, then engage in dialogue. Somehow:
View v = inflater.inflate(R.layout.dialog_set_timer, null); NumberPicker picker1 = (NumberPicker)v.findViewById(R.id.numberPickerMin); // второй точно так же // завайте им значения, вешайте листенеры...
builder.setTitle("Set time")
.setView(v)
...