【发布时间】:2011-07-05 22:31:14
【问题描述】:
我确实在这里尝试了“固定”罐子:
http://code.google.com/p/android/issues/detail?id=15394
并且还完全重新安装了 SDK,这两种方法都没有解决我在这里遇到的问题。那么startActivityForResult 与ListFragment 不一样吗?
原帖:
我有这个ClientListView,它是一个ListFragment,当单击操作栏上的按钮时,它会获取在ListFragment 视图中选择的内容并启动一个新活动来编辑选定的客户端(或者如果另一个选项是一起单击一个新客户端)。
这一切都很好。 ClientListView 片段和ClientDetailsFragment 被我的EditClientActivity FragmentActivity(它调用ClientEdit 片段)替换。这会占据整个屏幕并在操作栏中创建一个保存/取消按钮。
问题是当点击保存时,我无法用新创建的客户端或编辑的客户端更新我的ListFragment。为了完整起见,这是我的调用顺序:
MainActivity FragmentActivity 设置ClientListView ListFragment 和ClientDetailsActivity FragmentActivity(具有ClientDetails 片段)。然后ClientListView ListFragment 在其新的或编辑客户端选项被选中时可以在EditClientActivity 上启动ActivityForResult(其中包含ClientEdit 片段)。
ClientEdit 片段设置了保存取消的选项菜单,一旦选择了ClientEdit 片段中的保存,就会发生几件事:
新客户端或编辑的客户端被保存到数据库中。
mEditListener.onEditComplete() 被调用。由于调用 FragmentActivity EditClientActivity 实现了一个 onEditCompleteListener,我在 ClientEdit 片段中使用了 onAttach。
那么我的EditClientActivity 有onEditComplete(long id) 方法:
public void onEditComplete(long id) {
Intent in = new Intent();
this.setResult(1, in); //just something to let the ClientListView that the client i saved refresh the list.
Toast.makeText(this.getBaseContext(), "Client Saved", Toast.LENGTH_LONG).show();
finish(); //go back to our listview and client details view
}
在我的ClientListView('ListFragment' 类型)中,我有这个:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
this.setHasOptionsMenu(true);
//which columns to put as the cursor
String[] columns = new String[] { "firstname", "lastname" };
//how to post those columns into the layout. check client_row.xml for these ids
int[] to = new int[] { R.id.client_first_name_list_label, R.id.client_last_name_list_label};
myCursor = getClientsCursor(); //this is NOT closing the database connection if it does it gets an error
theClients = new SimpleCursorAdapter(this.getListView().getContext(),
R.layout.client_row, myCursor, columns, to);
setListAdapter(theClients);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.new_client:
// TODO: add recipe
showClientEdit(-1);
return true;
case R.id.client_delete:
// TODO: delete recipe
Toast.makeText(getActivity(), "Delete Client selected", Toast.LENGTH_LONG).show();
return true;
case R.id.client_edit:
if(mCurrentSelectedItemIndex!=-1)
showClientEdit(mCurrentSelectedItemIndex);
else
Toast.makeText(getActivity(), "Select client to edit!", Toast.LENGTH_LONG).show();
return true;
case android.R.id.home:
// TODO: Handle app icon click
Toast.makeText(getActivity(), "Home icon selected", Toast.LENGTH_LONG).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
void showClientEdit(long someId)
{
..do stuff to get the right client to pass to the intent
Intent intent = new Intent(getActivity(), EditClientActivity.class);
// Send the recipe index to the new activity
intent.putExtra(EditClientActivity.SELECTED_CLIENT, clientId);
startActivityForResult(intent, Activity.RESULT_OK);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
//never gets here :(
super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(this.getListView().getContext(), "Result code: " +resultCode , Toast.LENGTH_LONG).show();
if(resultCode ==1)
{
myCursor = getClientsCursor(); //not sure if i need this for the next line or not, want my list to update with newly
//added client or edited client names etc...
theClients.notifyDataSetChanged();
Toast.makeText(this.getListView().getContext(), "Data set notified!!!" , Toast.LENGTH_LONG).show();
}
}
问题是我的startActivityForRestult 从 ListFragment 调用EditClientActivity 吗?据我所知,永远不要打电话给onActivityResult。我提供了所有这些信息,试图弄清楚并掌握 Fragment/FragmentActivities 等应该如何相互交互。我是从我在教程、开发人员指南等方面学到的东西中做到这一点的。我对自己的进步感到非常满意,但现在陷入困境......并且可能意识到我做事的方式不是正确的方式。 ..我很想开悟。对我来说,android 最难的部分是管理所有这些活动和视图如何相互交互......
【问题讨论】:
标签: android android-fragments android-3.0-honeycomb