我从Android文档创建了以下DialogFragment:
公共类PayBillDialogFragment扩展了DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState){
final Bundle b = this.getArguments();
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage("Paga bollettino")
.setPositiveButton("Paga", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// FIRE ZE MISSILES!
}
})
.setNegativeButton("Cancella", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
return builder.create();
}
}
从另一个片段(ListFragment),当单击列的一行时,应该打开DialogFragment,按下DialogFragment的正按钮后,我希望能够删除ListFragment的选定行并调用一种执行与删除相关的远程操作的方法。 我按如下方式实现了ListFragment:
public static class ListFragment extends android.support.v4.app.ListFragment {
ArrayList<String> listItems=new ArrayList<String>();
ArrayAdapter<String> adapter;
public static final String ARG_SECTION_NUMBER = "section_number";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.list_fragment_view,
container, false);
ListView lv = (ListView)rootView.findViewById(android.R.id.list);
}});
adapter=new ArrayAdapter<String>(this.getActivity(),
android.R.layout.simple_list_item_1,
listItems);
setListAdapter(adapter);
return rootView;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
//opening the dialogfragment
}
}
}
我不知道的是在点击DialogFragment的正面按钮后如何处理动作。你能帮助我吗?
编辑:澄清一下,这是工作流程:点击列表 - &gt;显示DialogFragment - &gt;单击DialogFragment后,从列表中删除元素。
答案 0 :(得分:10)
这就是我处理片段和对话片段之间的通信的方法
示例片段:
public class MainFragment extends Fragment {
private static final int REQ_CODE = 1;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.main_fragment, container, false);
Button b = (Button) v.findViewById(R.id.button);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MyDialog dialog = new MyDialog();
dialog.setTargetFragment(MainFragment.this, REQ_CODE);
dialog.show(getFragmentManager(), "dialog");
}
});
return v;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Toast.makeText(getActivity(), "Result: " + resultCode,
Toast.LENGTH_SHORT).show();
super.onActivityResult(requestCode, resultCode, data);
}
}
DialogFragment示例:
public class MyDialog extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage("My dialog message")
.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
notifyToTarget(Activity.RESULT_OK);
}
})
.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
notifyToTarget(Activity.RESULT_CANCELED);
}
});
return builder.create();
}
private void notifyToTarget(int code) {
Fragment targetFragment = getTargetFragment();
if (targetFragment != null) {
targetFragment.onActivityResult(getTargetRequestCode(), code, null);
}
}
}
这是我改变方向时唯一可行的方法。
答案 1 :(得分:2)
您可以从ListFragment
拨打PayBillDialogFragment
两个选项。
第一个一个。所有通信都通过托管Activity
进行。这就是您通过在Activity
内调用((HostingActivity)PayBillDialogFragment.getActivity()).deleteItem()
来获取托管PayBillDialogFragment.setPositiveButton(onClick())
的方法。在HostingActivity.deleteItem()
中获取充气PayBillDialogFragment
并在其中调用一些删除方法。
请参阅http://developer.android.com/guide/components/fragments.html#EventCallbacks
<强>第二即可。您可以在创建DialogFragment对象时DialogFragment.setTargetFragment()
,然后在PayBillDialogFragment.setPositiveButton(onClick())
内,PayBillDialogFragment
DialogFragment.getTargetFragment()
,然后在那里调用delete方法。
答案 2 :(得分:0)
要调用对话框,您可以使用:
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
if (fm.findFragmentByTag("PayBillDialogFragment") == null) {
PayBillDialogFragment payBillDialogFragment = new PayBillDialogFragment();
payBillDialogFragment.show(fm, "PayBillDialogFragment");
}
在你的dialogFragment中,
setPositiveButton("Paga", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//Add your code here that should execute
//when positive button is clicked
}
});
答案 3 :(得分:0)
列表片段将使用适配器来显示元素。适配器需要以某些Collection的形式输入。所以,你可以做的是,当用户按下对话框片段上的“确定”按钮并将其传回“列表片段”时,可以从集合中删除该特定元素,并再次使用修改后的集合设置列表片段的适配器。