推荐的方法是使用接口从 DialogFragment 到 Activity 通信,然后从 Activity 到 Fragment。
在您的活动中:
public class Main extends FragmentActivity implements OnQuantitySelectedListener {
public interface OnQuantitySelectedListener {
void onFinishEditDialog(String inputText);
}
@Override
public void onFinishEditDialog(String inputText) {
Toast.makeText(this, "Quantity: " + inputText, Toast.LENGTH_SHORT).show();
}
}
然后是DialogFragment内部类
public static class ProductDialog extends DialogFragment {
static ProductDialog newInstance(ProductVO product) {
ProductDialog f = new ProductDialog();
Bundle args = new Bundle();
args.putSerializable("product", product);
f.setArguments(args);
return f;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
ProductVO product = (ProductVO) getArguments().getSerializable("product");
LayoutInflater factory = LayoutInflater.from(getActivity());
final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry, null);
mEditText = (EditText) textEntryView.findViewById(R.id.txt_your_name);
return new AlertDialog.Builder(getActivity())
.setIcon(R.drawable.ic_dialog_add)
.setTitle(R.string.add_product)
.setView(textEntryView)
.setPositiveButton(R.string.accept,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
OnQuantitySelectedListener listener = (OnQuantitySelectedListener) getActivity();
listener.onFinishEditDialog(mEditText.getText().toString());
}
}
)
.setNegativeButton(R.string.cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
}
)
.create();
}
}
R.layout.alert_dialog_text_entry 的 XML 来自API Demos。它不适合您从用户那里获取数量的用例,但它说明了使用自定义布局从用户那里获取价值。
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2008 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/username_view"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:text="@string/alert_dialog_username"
android:gravity="left"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/username_edit"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:scrollHorizontally="true"
android:autoText="false"
android:capitalize="none"
android:gravity="fill_horizontal"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/password_view"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:text="@string/alert_dialog_password"
android:gravity="left"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
android:id="@+id/password_edit"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_marginLeft="20dip"
android:layout_marginRight="20dip"
android:scrollHorizontally="true"
android:autoText="false"
android:capitalize="none"
android:gravity="fill_horizontal"
android:password="true"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>