ListFragment中的startActivityForResult似乎不会调用onActivityResult

时间:2011-07-05 22:31:14

标签: android android-fragments android-3.0-honeycomb

我在这里尝试了“固定”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 ListFragmentClientDetailsActivity 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等是如何相互交互的。我这样做是因为我学习了很多东西,包括教程,开发人员指南等。我对我的进步非常满意,但现在却在墙上......而且可能意识到我做事的方式并不是正确的方法。 ..我很想得到开悟。对我来说,这是最困难的部分是管理所有这些活动和视图如何相互作用....

3 个答案:

答案 0 :(得分:1)

您是否正在使用Fragments的兼容性库?

兼容性软件包存在问题,片段中的onActivityResult已损坏。看看http://code.google.com/p/android/issues/detail?id=15394。在那里你也可以下载一个固定版本的jar文件。

答案 1 :(得分:1)

我知道这个问题已经过时了,但我想为那些正在解决这个问题的人提供一个解决方案,就像我在搜索onActivityResultIntent未运行时所做的那样从片段内部调用(ListFragment或常规Fragment将具有相同的结果)。

您必须从主活动中致电startActivityForResult。因此,当您从像这样的片段中调用它时,请务必致电getActivity()

getActivity().startActivityForResult(Intent,ACTIVITY_INT);

答案 2 :(得分:0)

吓坏了。这是我使用结果/请求代码的方式:

startActivityForResult(intent, Activity.RESULT_OK);

不是启动它的方式,在那里添加了另一个数字而不是Activity.RESULT_OK并且它有效,我必须感到困惑。