显示现有ListFragment我有以下问题:如何在DialogFragment
我有一个exisiting ListFragment
,但我想这显示以对话方式。
我的第一种方法是创建一个DialogFragment
,其中有ListFragment
,但显然目前不可能将碎片放入碎片中。
扩展DialogFragment
而不是ListFragment
也是不可能的,因为大量使用ListFragment
方法。
有没有简单的方法来做到这一点?
显示现有ListFragment我有以下问题:如何在DialogFragment
我有一个exisiting ListFragment
,但我想这显示以对话方式。
我的第一种方法是创建一个DialogFragment
,其中有ListFragment
,但显然目前不可能将碎片放入碎片中。
扩展DialogFragment
而不是ListFragment
也是不可能的,因为大量使用ListFragment
方法。
有没有简单的方法来做到这一点?
什么工作对我来说是
1)在你的DialogFragment的xml布局中调用,比方说,DialogFragmentwWithListFragment指定ListFragment类
E.g. 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膨胀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");
希望,它帮助。
谢谢,但如果你需要'setArguments(什么)'创建'DialogFragmentwWithListFragment'时? – 2016-06-08 18:11:16
我会将ListView
放在DialogFragment
之内,或者尝试将ListFragment
放在Dialog
之内。我不确定第二个是否可能。
这打击了,如果我运行它两次:“产生的原因:java.lang.IllegalArgumentException异常:二进制XML文件6号线:复制ID 0x7f09007b,标签空,另一个片段” – kenyee 2014-09-29 02:01:21
你可以通过一个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;
}
}
最小的实现和其他固定或父ID为0xffffffff:http://stackoverflow.com/questions/12516626/listfragment-as-dialogfragment/16430898#16430898 – Hpsaturn 2013-05-08 00:47:53
当添加另一个片段中的片段,该文件说,你应该动态地(这样做即,不是硬编码一个<fragment>
代码到你的布局XML。
因此,这里是如何动态地做到这一点。在这种情况下, ,我加MyListFragment
到MyDialogFragment
:
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>
这样做的另一个好处这种方式是,你可以创建一个内部片段的实例,以便将任何参数传递给它。
为了完整起见,这里是我在活动中使用,以显示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();
}
我也有类似的问题。我很惊讶,我无法在任何地方找到答案。我认为这是一个常见的任务,例如当您想要使用纵向片段显示全屏活动时,以及横向显示与对话框相同的片段。 – 2013-01-11 00:53:24
我最终显示了在框架布局中覆盖Main-Fragment的现有ListFragment。我看起来相当不错在我看来,有点像这样:http://1.bp.blogspot.com/-f_1A98GQ1fU/T0bzdWnYIOI/AAAAAAAAUmA/MuRnT7-YU28/s1600/export_06.png – knaecke 2013-01-14 22:55:37
也许这个例如:http:// stackoverflow.com/questions/12516626/listfragment-as-dialogfragment/16430898#16430898 – Hpsaturn 2013-05-08 00:48:56