it-swarm.com.de

DialogFragment aus Fragment aufrufen (nicht FragmentActivity)?

Hier ist mein Problem: Ich habe eine FragmentActivity, die eine Fragmentliste enthält (mit Methoden, um zwischen ihnen zu navigieren) In einem dieser Fragmente muss ich ein DialogFragment aufrufen, um ein "Zoom" eines in enthaltenen Bildes anzuzeigen dieses Fragment.

Es scheint jedoch, dass Sie ein DialogFragment nicht direkt von einem Fragment aus aufrufen können.

Gibt es eine Möglichkeit, eine Art "Rückruf" für die FragmentActivity zu erhalten, um das DialogFragment über dem Fragment anzuzeigen.

Oder einfach eine "Panne", um es direkt vom Fragment aus zu nennen.

Wenn es der Fall ist, weißt du Guyz ein gutes Tutorial darüber?

Freundliche Grüße,

Elie Page

13
Elie Page

Wenn Sie eine neue Dialog erstellen, können Sie sie einfach mit dieser (sehr) einfachen Methode von einer Fragment aus aufrufen.

DialogFragment dialog = DialogFragment.instantiate(getActivity(), "Hello world");
dialog.show(getFragmentManager(), "dialog");

Wenn Sie einen eigenen Dialog verwenden möchten, verwenden Sie bitte diese Art von Code.

public class MyDialogFragment extends DialogFragment
{
    //private View pic;

    public MyDialogFragment()
    {
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_my_dialog, new LinearLayout(getActivity()), false);

        // Retrieve layout elements
        TextView title = (TextView) view.findViewById(R.id.text_title);

        // Set values
        title.setText("Not perfect yet");

        // Build dialog
        Dialog builder = new Dialog(getActivity());
        builder.requestWindowFeature(Window.FEATURE_NO_TITLE);
        builder.getWindow().setBackgroundDrawable(new ColorDrawable(Android.graphics.Color.TRANSPARENT));
        builder.setContentView(view);
        return builder;
    }
}
14
Manitoba

Überprüfen Sie die Importanweisungen ..__ Wenn wir verwenden

ExampleDialogFragment dialog = new ExampleDialogFragment ();
dialog .show(getFragmentManager(), "example");

Dann stellen Sie sicher, dass Sie importieren

import Android.app.DialogFragment;
import Android.app.Fragment;

nicht aus der Support-Bibliothek.

import Android.support.v4.app.DialogFragment;
import Android.support.v4.app.Fragment;
7
Amit

es hilft, wenn Sie ein Fragmentdialogfeld in einem Fragment anzeigen müssen

Dialogfragment

public class DialogBoxFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    View rootView = inflater.inflate(R.layout.dialog_fragment, container, false);
    getDialog().setTitle("simple dialog");
    return rootView;
}
}

zeigt nun den Fragmentdialog in ein Fragment

DialogFragment dialogFragment = new DialogFragment ();
                            dialogFragment.show(getActivity().getFragmentManager(),"simple dialog");

4
PradeepNama

Für mich war dies Folgendes: https://stackoverflow.com/a/25056160/2413303

Das wichtigste ist, dass Sie eine Callback für Ihr Dialogfragment benötigen:

public class MyFragment extends Fragment implements MyDialog.Callback

Welche Art funktioniert so

public class MyDialog extends DialogFragment implements View.OnClickListener {

public static interface Callback
{
    public void accept();
    public void decline();
    public void cancel();
}

Sie lassen die Aktivität den Dialog für Sie aus dem Fragment anzeigen:

    MyDialog dialog = new MyDialog();
    dialog.setTargetFragment(this, 1); //request code
    activity_showDialog.showDialog(dialog);

Wo showDialog() für mich die folgende Methode war:

@Override
public void showDialog(DialogFragment dialogFragment)
{
    FragmentManager fragmentManager = getSupportFragmentManager();
    dialogFragment.show(fragmentManager, "dialog");
}

Und Sie rufen zurück zu Ihrem Zielfragment:

@Override
public void onClick(View v)
{
    Callback callback = null;
    try
    {
        callback = (Callback) getTargetFragment();
    }
    catch (ClassCastException e)
    {
        Log.e(this.getClass().getSimpleName(), "Callback of this class must be implemented by target fragment!", e);
        throw e;
    }

    if (callback != null)
    {
        if (v == acceptButton)
        {   
            callback.accept();
            this.dismiss();
        }
        else if (...) {...}
    }
    else
    {
        Log.e(this.getClass().getSimpleName(), "Callback was null.");
    }
}
1
EpicPandaForce

Ich hatte das gleiche Problem, das durch Import gelöst wurde 

import Android.support.v4.app.ListFragment;

anstatt

import Android.app.ListFragment;
1
Khalid

Versuchen Sie diese einfache Klasse, die ich in einem Myown-Projekt gemacht habe:

        public class UIDialogMessage extends DialogFragment {

    public static UIDialogMessage newInstance(int aTitleID, int aMessageID) {
        return newInstance(aTitleID, aMessageID, true);
    }

    public static UIDialogMessage newInstance(int aTitleID, int aMessageID, boolean aDoIt) {
        UIDialogMessage frag = new UIDialogMessage();
        Bundle args = new Bundle();
        args.putInt("titleID", aTitleID);
        args.putInt("messageID", aMessageID);
        args.putBoolean("keyBoolDoSomething", aDoIt);
        frag.setArguments(args);
        return frag;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int mTitleID = getArguments().getInt("titleID");
        int mMessageID = getArguments().getInt("messageID");
        final boolean mDoIt= getArguments().getBoolean("keyBoolDoSomething", true);

        return new AlertDialog.Builder(getActivity())
                .setTitle(mTitleID)
                .setMessage(mMessageID)
                .setPositiveButton(getResources().getString(R.string.dialog_button_gotcha),
                        new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface dialog, int whichButton) {
                                dialog.dismiss();
                                if (mDoIt)
                                    doIt();
                            }
                        })
                .create();
    }

    private void doIt() {
        ...
    }
}

und Sie können wie unten gezeigt von einem Fragment aus anrufen:

showDialog(R.string.dialog_title, R.string.dialog_message, false);

private void showDialog(int aTitleID, int aMessageID, boolean aDoIt) {
        DialogFragment uiDialogMessage = UIDialogMessage.newInstance(aTitleID, aMessageID, aDoIt);
        uiDialogMessage.show(getFragmentManager(), "dialog");
    }
0
Ciro Rizzo