it-swarm.com.ru

Вызов DialogFragment из фрагмента (не FragmentActivity)?

Вот моя проблема: У меня есть FragmentActivity, которое содержит список фрагментов (с методами для навигации между ними) В одном из фрагментов thoose мне нужно вызвать DialogFragment, чтобы отобразить «зум» на изображении, содержащемся в этот фрагмент.

Но кажется, что вы не можете вызвать DialogFragment напрямую из фрагмента.

Есть ли способ получить что-то вроде «обратного вызова» для FragmentActivity, чтобы сделать это отображение DialogFragment поверх фрагмента.

Или просто «глюк», чтобы вызвать его прямо из фрагмента.

Если это так, знаете ли вы хороший урок об этом?

С наилучшими пожеланиями,

Эли Пейдж

13
Elie Page

Когда вы создаете новый Dialog, вы можете просто вызвать его, используя этот (очень) простой метод из Fragment.

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

Если вы хотите использовать свой собственный диалог, используйте такой код.

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

Проверьте на импорт заявления . Если мы используем

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

Затем убедитесь, что для импорта

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

не из библиотеки поддержки.

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

это поможет, если вам нужно показать диалог фрагмента внутри фрагмента

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;
}
}

теперь показывает фрагмент диалога в фрагмент

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

4
PradeepNama

Для меня это было следующее: https://stackoverflow.com/a/25056160/2413303

Наиболее важными частями являются то, что вам нужно иметь Callback для вашего фрагмента диалога:

public class MyFragment extends Fragment implements MyDialog.Callback

Что-то вроде этого работает

public class MyDialog extends DialogFragment implements View.OnClickListener {

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

Вы заставляете Activity показывать диалог из фрагмента:

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

Где showDialog() для меня был следующий метод:

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

И вы перезвоните на ваш целевой фрагмент:

@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

У меня была такая же проблема Решена с помощью импорта 

import Android.support.v4.app.ListFragment;

вместо

import Android.app.ListFragment;
1
Khalid

Попробуйте этот простой класс, который я сделал в моем проекте:

        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() {
        ...
    }
}

и вы можете позвонить с фрагмента, как показано ниже:

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