我在这里尝试了“固定”jar:
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
(其中包含ClientEdit
片段)上的startActivityForResult。
ClientEdit
Fragment设置了取消保存的选项菜单,一旦选择ClientEdit
片段中的保存,就会发生以下几件事情:
将新客户端或已编辑的客户端保存到数据库中。
调用mEditListener.onEditComplete()
。由于调用FragmentActivity
EditClientActivity
实现了onEditCompleteListener
我在onAttach
片段中使用ClientEdit
。
然后我的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等是如何相互交互的。我这样做是因为我学习了很多东西,包括教程,开发人员指南等。我对我的进步非常满意,但现在却在墙上......而且可能意识到我做事的方式并不是正确的方法。 ..我很想得到开悟。对我来说,这是最困难的部分是管理所有这些活动和视图如何相互作用....
答案 0 :(得分:1)
您是否正在使用Fragments的兼容性库?
兼容性软件包存在问题,片段中的onActivityResult已损坏。看看http://code.google.com/p/android/issues/detail?id=15394。在那里你也可以下载一个固定版本的jar文件。
答案 1 :(得分:1)
我知道这个问题已经过时了,但我想为那些正在解决这个问题的人提供一个解决方案,就像我在搜索onActivityResult
时Intent
未运行时所做的那样从片段内部调用(ListFragment
或常规Fragment
将具有相同的结果)。
您必须从主活动中致电startActivityForResult
。因此,当您从像这样的片段中调用它时,请务必致电getActivity()
:
getActivity().startActivityForResult(Intent,ACTIVITY_INT);
答案 2 :(得分:0)
吓坏了。这是我使用结果/请求代码的方式:
startActivityForResult(intent, Activity.RESULT_OK);
不是启动它的方式,在那里添加了另一个数字而不是Activity.RESULT_OK
并且它有效,我必须感到困惑。