【问题标题】:startActivityForResult from a ListFragment doesn't seem to call onActivityResultListFragment 中的 startActivityForResult 似乎没有调用 onActivityResult
【发布时间】:2011-07-05 22:31:14
【问题描述】:

我确实在这里尝试了“固定”罐子:

http://code.google.com/p/android/issues/detail?id=15394

并且还完全重新安装了 SDK,这两种方法都没有解决我在这里遇到的问题。那么startActivityForResultListFragment 不一样吗?

原帖:

我有这个ClientListView,它是一个ListFragment,当单击操作栏上的按钮时,它会获取在ListFragment 视图中选择的内容并启动一个新活动来编辑选定的客户端(或者如果另一个选项是一起单击一个新客户端)。

这一切都很好。 ClientListView 片段和ClientDetailsFragment 被我的EditClientActivity FragmentActivity(它调用ClientEdit 片段)替换。这会占据整个屏幕并在操作栏中创建一个保存/取消按钮。

问题是当点击保存时,我无法用新创建的客户端或编辑的客户端更新我的ListFragment。为了完整起见,这是我的调用顺序:

MainActivity FragmentActivity 设置ClientListView ListFragmentClientDetailsActivity FragmentActivity(具有ClientDetails 片段)。然后ClientListView ListFragment 在其新的或编辑客户端选项被选中时可以在EditClientActivity 上启动ActivityForResult(其中包含ClientEdit 片段)。

ClientEdit 片段设置了保存取消的选项菜单,一旦选择了ClientEdit 片段中的保存,就会发生几件事:

新客户端或编辑的客户端被保存到数据库中。 mEditListener.onEditComplete() 被调用。由于调用 FragmentActivity EditClientActivity 实现了一个 onEditCompleteListener,我在 ClientEdit 片段中使用了 onAttach

那么我的EditClientActivityonEditComplete(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


    【解决方案1】:

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

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

    【讨论】:

    • 你知道如果那是额外文件夹中的罐子,那么是的。猜猜我抓住了固定的,让它裂开..如果是这样,那么我希望我的活动应该有效吗?我将适配器更新为 hupdate 列表的方式是否正确? IE。 onActivityResult 中的代码?
    • onActivityResult 应该适用于那个固定的 jar,试一试,它只是切换 jar 的问题
    • 得到那个固定的 jar,重建,在我的公共类 ClientListView 扩展 ListFragment 中仍然没有触发 onActivityResult 的断点。我不知道该怎么做。
    【解决方案2】:

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

    您必须从您的主活动中调用您的startActivityForResult。因此,当您从这样的片段内部调用getActivity() 时,请确保调用它:

    getActivity().startActivityForResult(Intent,ACTIVITY_INT);
    

    【讨论】:

      【解决方案3】:

      Freaking 想通了。这是我使用结果/请求代码的方式:

      startActivityForResult(intent, Activity.RESULT_OK);

      不是开始它的方式,在那里添加了另一个数字而不是 Activity.RESULT_OK 并且它起作用了,我一定很困惑。

      【讨论】:

      • 无论如何你都应该使用那个常量,它要求一个请求代码来识别你的请求,并且你试图传递一个结果代码,当结果活动完成时你会使用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2014-08-11
      • 2011-02-21
      • 1970-01-01
      • 2012-11-29
      相关资源
      最近更新 更多