10

私は次の問題を抱えています:

既存ListFragmentのものがありますが、これをダイアログとして表示したいと思います。

私の最初のアプローチは、その内部に必要なを作成することでしDialogFragmentListFragmentが、現在、フラグメントをフラグメントに入れることはできないようです。

メソッドを多用するため、DialogFragment代わりに拡張することもできません。ListFragmentListFragment

これを行う簡単な方法はありますか?

4

4 に答える 4

10

私にとってうまくいくのは、

1) DialogFragment の xml レイアウトで、たとえば DialogFragmentwWithListFragment と呼ばれるListFragmentクラスを指定することです。
例: dialog_fragment_with_list_fragment.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <fragment
             android:id="@+id/flContent"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:padding = "10dp"
             class="com.xxx.yyy.DialogFragmentwWithListFragment " />
</LinearLayout>

2 ) DialogFragmentwWithListFragment inflate dialog_fragment_with_list_fragment.xml

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.dialog_fragment_with_list_fragment, null);
}

3) DialogFragmentwWithListFragment を通常の DialogFragment として呼び出します。

 DialogFragmentwWithListFragment dialogFragment = DialogFragmentwWithListFragment  .newInstance();
 dialogFragment.setRetainInstance(true);
 dialogFragment.show(getFragmentManager(), "tag");


それが役に立てば幸い。

于 2013-04-24T10:56:31.280 に答える
3

次の方法でリストを表示できますDialogFragment:(サポートv4ライブラリを使用)

public class MyListDialogFragment extends DialogFragment {
    onDlgListClick mCallback;

    private String[] lista;//the list you want to show with the dialog

    public static MyListDialogFragment newInstance(Bundle fB){
    MyListDialogFragment lstFrag = new MyListDialogFragment();
    Bundle args = new Bundle();
        args.putStringArray("lista", fB.getStringArray("lista"));//the list
        args.putString("titulo", fB.getString("titulo"));//the title of the list
        lstFrag.setArguments(args);

        return lstFrag;
    }

    public interface onDlgListClick{
        public void onLstItemSelected(String selection);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (onDlgListClick) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement onLstItemSelected");
        }
        this.setCancelable(false);
    }

     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         lista = getArguments().getStringArray("lista");

         return new AlertDialog.Builder(getActivity())
         .setTitle(getArguments().getString("titulo"))
         .setCancelable(false)
         .setItems(lista, new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int item){

                mCallback.onLstItemSelected(lista[item]);
                getDialog().dismiss(); //maybe you dont need these two lines
                MyListDialogFragment.this.dismiss();
            }
         }).create();
     }

}

メインアクティビティでは、インターフェイスを拡張FragmentActivityして実装しますMyListDialogFragment.onDlgListClick

//the interface
@Override
public void onLstItemSelected(String selection) {//list dialog fragment interface
//do whatever you want
}

//calling the dialog
public void showFrags(int id){

        Bundle fB = new Bundle();

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        Fragment prev = getSupportFragmentManager().findFragmentByTag("listdialog");
        if (prev != null) {
            ft.remove(prev);
        }
        ft.commit();
        switch(id){
        case 0:
        fB.putStringArray("lista", list); fB.putString("titulo",title);
        MyListDialogFragment newListDlg = MyListDialogFragment.newInstance(fB);
        newListDlg.show(ft, "listdialog");
        break;
        }
}
于 2012-08-26T09:40:03.817 に答える
3

内側に a を入れるか、ListView内側に aをDialogFragment入れようとします。ただし、2番目のものが可能かどうかはわかりません。ListFragmentDialog

于 2012-08-02T19:51:56.480 に答える
1

<fragment>ドキュメントには、別のフラグメント内にフラグメントを追加する場合、動的に行う必要があると記載されています (つまり、レイアウト XML にタグをハードコーディングするのではなく) 。

したがって、動的に行う方法は次のとおりです。この場合、次のように追加MyListFragmentMyDialogFragmentます。

MyDialogFragment.java

import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;

public class MyDialogFragment extends DialogFragment {

    public static final String TAG = MyDialogFragment.class.getSimpleName();
    private static final String ARG_TITLE = "ARG_TITLE";

    private EditText mEditText;

    public MyDialogFragment() {
        // Empty constructor required for DialogFragment
    }

    public static MyDialogFragment newInstance(String title) {
        MyDialogFragment myDialogFragment = new MyDialogFragment();
        Bundle args = new Bundle();
        args.putString(ARG_TITLE, title);
        myDialogFragment.setArguments(args);
        return myDialogFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        Bundle args = getArguments();
        if (args != null) {
            dialog.setTitle(args.getString(ARG_TITLE));
        }
        return dialog;
    }

    public void setTitle(String title) {
        Dialog dialog = getDialog();
        dialog.setTitle(title);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_fragment_selected_products, container, false);
        //addInnerFragment();

        Button okButton = (Button)view.findViewById(R.id.okButton);
        okButton.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        dismiss();
                        //dismissAllowingStateLoss();
                    }
                }
        );

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        //addInnerFragment();
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        addInnerFragment();
    }

    public void addInnerFragment() {

        FragmentManager childFragmentManager = getChildFragmentManager();
        FragmentTransaction transaction = childFragmentManager.beginTransaction();
        //transaction.add(R.id.fragmentContainer, new MyListFragment());
        transaction.add(R.id.fragmentContainer, MyListFragment.newInstance(MyListFragment.MODE_SELL));
        //transaction.commit();
        transaction.commitAllowingStateLoss();
        childFragmentManager.executePendingTransactions();

    }

}

(ご覧のとおり、ダイアログのタイトルを設定する機能もいくつか含まれています。)

dialog_fragment_selected_products.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MyDialogFragment"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/fragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_alignParentTop="true"
        android:layout_above="@+id/okButton" />

    <Button
        android:id="@+id/okButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="@string/ok" />

</RelativeLayout>

このようにすることのもう 1 つの利点は、任意の引数を渡すために内部フラグメントのインスタンスを作成できることです。

完全を期すために、DialogFragment を表示するためにアクティビティで使用するコードを次に示します。

MyActivity.java

private void showCurrentItemsDialog() {

    MyDialogFragment myDialogFragment = MyDialogFragment.newInstance("cpuk.org");
    //myDialogFragment.setRetainInstance(true);

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.add(myDialogFragment, MyDialogFragment.TAG);
    transaction.commitAllowingStateLoss();
    fragmentManager.executePendingTransactions();

}
于 2016-06-09T14:52:08.247 に答える