我有一个活动和一个片段 在我的活动中,我在操作栏中有按钮,在按钮上单击一个弹出的对话框,我有一个列表视图。 如果我从该列表中选择任何项目,该数据将转到片段,并根据活动中的数据显示我的片段列表视图
e.g。如果我选择技术,技术id = 1应该传入我的查询参数,并根据我的片段列表视图应该出现。 每次我从列表中选择不同的项目时,我的片段列表视图应该更新。
但我的问题是我没有获得片段中的任何数据,而且我的列表没有得到更新
Mainactivity.java
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem actionViewItem = menu.findItem(R.id.miActionButton);
// Retrieve the action-view from menu
View v = MenuItemCompat.getActionView(actionViewItem);
// Find the button within action-view
Button b = (Button) v.findViewById(R.id.btnCustomAction);
// Handle button click here
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(CUSTOM_DIALOG_ID);
}
});
return super.onPrepareOptionsMenu(menu);
}
@Override
public Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch (id) {
case CUSTOM_DIALOG_ID:
dialog = new Dialog(this);
dialog.setContentView(R.layout.dialoglayout);
dialog.setTitle("Select Category");
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
dialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
}
});
dialog.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
// TODO Auto-generated method stub
}
});
// Prepare ListView in dialog
dialog_ListView = (ListView) dialog.findViewById(R.id.dialoglist);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, listContent);
dialog_ListView.setAdapter(adapter);
dialog_ListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
// i = (int) parent.getItemIdAtPosition(position);
category_name = (String) parent.getItemAtPosition(position);
Log.d("category name", category_name);
if(category_name.equals("a"))
{
cat_id=1;
}
if(category_name.equals("b"))
{
cat_id=2;
}
if(category_name.equals("c"))
{
cat_id=3;
}
if(category_name.equals("d"))
{
cat_id=4;
}
if(category_name.equals("e"))
{
cat_id=5;
}
if(category_name.equals("f"))
{
cat_id=6;
}
Log.d("id",""+cat_id);
dismissDialog(CUSTOM_DIALOG_ID);
}
});
break;
}
return dialog;
}
public int getMyData() {
return cat_id;
}
Fragment.java:
public String param;
public String url;
public int cat_id;
Mainactivity activity = (Mainactivity) getActivity();
int myDataFromActivity = activity.getMyData();
cat_id = myDataFromActivity;
Log.d("Category_id", "" + cat_id);
Map<String, String> map1 = new HashMap<String, String>();
param = "?cat_id=" + cat_id;
//URL is fake , original url is working fine.
url = "http://www.abbcd.com/xyz/webservices/data/getAllData.php"
+ param;
map1.put("url", url);
new MultiPartRequester(mainActivity, map1,
NetUtils.RequestCode.GET_ALL_DATA,
this).execute();
更新部分:
@Override
public void updateFragmentList(int catId) {
// TODO Auto-generated method stub
param = "?cat_id=" + catId;
url = "http://www.abbcd.com/xyz/webservices/data/getAllData.php"+ param;
Map<String, String> map1 = new HashMap<String, String>();
map1.put("url", url);
new MultiPartRequester(mainActivity, map1,
NetUtils.GET_DATA, this)
.execute();
}
答案 0 :(得分:2)
Activity
和Fragment
之间的良好沟通方式是Listeners
。如果要更新片段,请使用侦听器并更新片段。在MainActivity
<强>监听强>
public interface FragmentListener {
void updateFragmentList(int catId);
}
在Fragment
中实施
public class MyFragment extends Fragment implements MainActivity.FragmentListener
然后在Fragment的onActivityCreated
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
((MainActivity) getActivity()).setFragmentListener(this);
}
<强> MainActivity 强>
public void setFragmentListener(FragmentListener listener)
{
this.fragmentListener = listener;
}
public void sendDataToFragment(int catId) {
this.fragmentListener.updateFragmentList(catId);
}
希望这有帮助。
<强>更新强>
使用this.fragmentListener.updateFragmentList(catId);
将数据发送到片段,在Fragment
中创建方法为``
public void updateFragmentList(int catId){
//Here update your listview with cat id
}
答案 1 :(得分:-1)
在活动中使用静态全局变量
public static int cat_id = 0;
在片段中访问cat_id
,如下所示
Map<String, String> map1 = new HashMap<String, String>();
param = "?cat_id=" + activity.cat_id;
或在getMyData
方法中进行以下更改
public int getMyData() {
return cat_id;
}
<强>编辑:强>
另一种方法最终起作用,从活动中调用你的fragment方法并在方法中传递cat_id
。 而不是ExampleFragment
使用您的片段名称。
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.mymethod(cat_id);