如何使用 Dialogfragment 和 ArrayAdapter 创建列表对话框以填充 Java class 中的项目?
How to create a list dialog using Dialogfragment and ArrayAdapter to populate items from Java class?
我自己正在学习 DialogFragments。除了从按钮传递意图外,我从未尝试过任何其他方法,所以我没有找到正确的方向。
我想学习所有可能的方法。
它与使用 ListFragment 创建列表有什么不同吗?
主 Activity 上有 2 个按钮。单击第二个按钮时,它应该打开一个带有项目列表的 DialogFragment,单击一个列表项目应该在浏览器中打开 URL。
主要Activity
btnDepartment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Intent intent = new Intent(MainActivity.this, DepartmentActivity.class);
//startActivity(intent);
}
});
这里是部门Class,是纯Javaclass
public class Department {
private String deptName, deptUrl;
public static final Department[] myDepartment = {
new Department("CS", "http://cs.com"),
new Department("Biology", "http://bio.com"),
new Department("Chemistry", "http://www.chemistry.com"),
new Department("Nursing", "http://nursing.com")
};
private Department(String deptName, String deptUrl){
this.deptName = deptName;
this.deptUrl = deptUrl;
}
public String getDeptName() {
return deptName;
}
public String getDeptUrl() {
return deptUrl;
}
@Override
public String toString() {
return deptName;
}
}
部门片段
public class DepartmentFragment extends DialogFragment {
public DepartmentFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_department, container, false);
}
}
Is [creating a DialogFragment] different than creating list with ListFragment
简单地说:是的。
为什么?因为 ListFragment
使您可以访问 getListView()
和 setAdapter()
以及 class 的实例方法。
为了对不从 ListFragment
扩展的任何其他片段 class 执行此操作,您必须使用 ListView
声明一些 XML 布局并执行某些操作像这样
我假设 fragment_department.xml
包含 @+id/list
的 ListView
元素,并且您不关心部门信息的显示方式。
public class DepartmentFragment extends DialogFragment {
public DepartmentFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_department, container, false);
ListView lstView = (ListView) rootView.findViewById(R.id.list);
ArrayAdapter<Department> adapter = new ArrayAdapter<Department>(getActivity(), android.R.layout.simple_list_item_1, Department.myDepartment);
lstView.setAdapter(adapter);
// TODO: adapter.setOnItemClickListener
// ... handle click
// ... load webpage
return rootView;
}
}
首先,您的模型必须实现 Parcelable:
public class Department implements Parcelable {
private String deptName, deptUrl;
public static final Department[] myDepartment = {
new Department("CS", "http://cs.com"),
new Department("Biology", "http://bio.com"),
new Department("Chemistry", "http://www.chemistry.com"),
new Department("Nursing", "http://nursing.com")
};
private Department(String deptName, String deptUrl){
this.deptName = deptName;
this.deptUrl = deptUrl;
}
protected Department(Parcel in) {
deptName = in.readString();
deptUrl = in.readString();
}
public static final Creator<Department> CREATOR = new Creator<Department>() {
@Override
public Department createFromParcel(Parcel in) {
return new Department(in);
}
@Override
public Department[] newArray(int size) {
return new Department[size];
}
};
public String getDeptName() {
return deptName;
}
public String getDeptUrl() {
return deptUrl;
}
@Override
public String toString() {
return deptName;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(deptName);
parcel.writeString(deptUrl);
}
}
之后,必须实现方法:
btnDepartment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DepartmentFragment departmentFragment = DepartmentFragment.newInstance(department);
departmentFragment.show(getSupportFragmentManager(), "departmentFragment");
}
});
片段如下:
public class DepartmentFragment extends DialogFragment {
private Department department;
public DepartmentFragment() {
// Required empty public constructor
}
public static DepartmentFragment newInstance(Department department) {
DepartmentFragment f = new DepartmentFragment();
// Supply num input as an argument.
Bundle extras = new Bundle();
args.putParcelable("department", department);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
department = getArguments().getParcelable("department")
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_department, container, false);
}
}
此外,您可以在 http://developer.android.com/reference/android/app/DialogFragment.html
查看所有信息
我自己正在学习 DialogFragments。除了从按钮传递意图外,我从未尝试过任何其他方法,所以我没有找到正确的方向。
我想学习所有可能的方法。
它与使用 ListFragment 创建列表有什么不同吗?
主 Activity 上有 2 个按钮。单击第二个按钮时,它应该打开一个带有项目列表的 DialogFragment,单击一个列表项目应该在浏览器中打开 URL。
主要Activity
btnDepartment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Intent intent = new Intent(MainActivity.this, DepartmentActivity.class);
//startActivity(intent);
}
});
这里是部门Class,是纯Javaclass
public class Department {
private String deptName, deptUrl;
public static final Department[] myDepartment = {
new Department("CS", "http://cs.com"),
new Department("Biology", "http://bio.com"),
new Department("Chemistry", "http://www.chemistry.com"),
new Department("Nursing", "http://nursing.com")
};
private Department(String deptName, String deptUrl){
this.deptName = deptName;
this.deptUrl = deptUrl;
}
public String getDeptName() {
return deptName;
}
public String getDeptUrl() {
return deptUrl;
}
@Override
public String toString() {
return deptName;
}
}
部门片段
public class DepartmentFragment extends DialogFragment {
public DepartmentFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_department, container, false);
}
}
Is [creating a DialogFragment] different than creating list with ListFragment
简单地说:是的。
为什么?因为 ListFragment
使您可以访问 getListView()
和 setAdapter()
以及 class 的实例方法。
为了对不从 ListFragment
扩展的任何其他片段 class 执行此操作,您必须使用 ListView
声明一些 XML 布局并执行某些操作像这样
我假设 fragment_department.xml
包含 @+id/list
的 ListView
元素,并且您不关心部门信息的显示方式。
public class DepartmentFragment extends DialogFragment {
public DepartmentFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_department, container, false);
ListView lstView = (ListView) rootView.findViewById(R.id.list);
ArrayAdapter<Department> adapter = new ArrayAdapter<Department>(getActivity(), android.R.layout.simple_list_item_1, Department.myDepartment);
lstView.setAdapter(adapter);
// TODO: adapter.setOnItemClickListener
// ... handle click
// ... load webpage
return rootView;
}
}
首先,您的模型必须实现 Parcelable:
public class Department implements Parcelable {
private String deptName, deptUrl;
public static final Department[] myDepartment = {
new Department("CS", "http://cs.com"),
new Department("Biology", "http://bio.com"),
new Department("Chemistry", "http://www.chemistry.com"),
new Department("Nursing", "http://nursing.com")
};
private Department(String deptName, String deptUrl){
this.deptName = deptName;
this.deptUrl = deptUrl;
}
protected Department(Parcel in) {
deptName = in.readString();
deptUrl = in.readString();
}
public static final Creator<Department> CREATOR = new Creator<Department>() {
@Override
public Department createFromParcel(Parcel in) {
return new Department(in);
}
@Override
public Department[] newArray(int size) {
return new Department[size];
}
};
public String getDeptName() {
return deptName;
}
public String getDeptUrl() {
return deptUrl;
}
@Override
public String toString() {
return deptName;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(deptName);
parcel.writeString(deptUrl);
}
}
之后,必须实现方法:
btnDepartment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DepartmentFragment departmentFragment = DepartmentFragment.newInstance(department);
departmentFragment.show(getSupportFragmentManager(), "departmentFragment");
}
});
片段如下:
public class DepartmentFragment extends DialogFragment {
private Department department;
public DepartmentFragment() {
// Required empty public constructor
}
public static DepartmentFragment newInstance(Department department) {
DepartmentFragment f = new DepartmentFragment();
// Supply num input as an argument.
Bundle extras = new Bundle();
args.putParcelable("department", department);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
department = getArguments().getParcelable("department")
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_department, container, false);
}
}
此外,您可以在 http://developer.android.com/reference/android/app/DialogFragment.html
查看所有信息