在片段中获取活动结果

时间:2015-05-10 17:15:29

标签: android android-fragments android-listview

默认情况下我创建了一个导航抽屉,用于创建我的主片段启动。现在从我的主要活动开始,我将进入下一个活动,在那里我执行一些操作并使用onActivityResult返回mainactivity。

到此为止一切正常。这是我的问题。

我的HomeFragment中有一个listview,所以在onActivityResult中我得到了在其他活动中执行的值。现在我如何将这些值传递给我的主片段。

这是我从mainactivity启动新活动的方式:

Intent i = new Intent(MainActivity.this, AddTask.class);
startActivityForResult(i,1);

现在在AddTask中我执行一些操作并发送回主活动,如下所示:

Intent i = new Intent(AddTask.this,MainActivity.class);
setResult(RESULT_OK, i);
finish();

现在在我的MainActivity onActivityResult:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == 1) {
                if(resultCode == RESULT_OK){
                     AddedTask = data.getStringExtra("NewTask");
                     CategoryName= data.getStringExtra("CategoryItem");
                     TaskTime=data.getStringExtra("TaskTime");

                    SharedPreferences settings = getSharedPreferences("taskdetails", 
                         Context.MODE_PRIVATE);

                    SharedPreferences.Editor editor = settings.edit();
                    editor.putString("NewTask", AddedTask);
                    editor.putString("CategoryItem", CategoryName);
                    editor.putString("TaskTime", TaskTime);
                    editor.commit();

                }
                if (resultCode == RESULT_CANCELED) {
                    //Write your code if there's no result
                }
            }
     }

现在我的HomeFragment中有一个listView,我需要使用这些值进行更新:

public class HomeFragment extends Fragment  {
    ListView lv;
    static final String TAG ="HomeFragment";
    private AdapterListViewData adapterListViewData; 
    private ArrayList<DataShow> listData = new ArrayList<DataShow>();
    private ListView listViewData;
    String CategoryName,TaskTime;
    String AddedTask;
    public HomeFragment(){}
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_home, container, false);
        listViewData = (ListView)rootView.findViewById(R.id.listViewData);

        SharedPreferences settings = this.getActivity().getSharedPreferences("taskdetails", 
                Context.MODE_PRIVATE);
         AddedTask = settings.getString("NewTask",null);
         CategoryName= settings.getString("CategoryItem",null);
         TaskTime=settings.getString("TaskTime",null);
         listData.add(new DataShow(AddedTask,CategoryName,TaskTime));
         adapterListViewData = new AdapterListViewData(getActivity().getBaseContext(),listData);
         adapterListViewData.notifyDataSetChanged();
        return rootView;
  }



}

我没有收到任何错误,列表视图也没有显示。请告诉我。

5 个答案:

答案 0 :(得分:0)

从我所看到的,你永远不会将你的适配器设置为listView。

因此,在创建新的AdapterListViewData和执行.notifyDataSetChanged()之间添加以下内容

listViewData.setAdapter(adapterListViewData);

答案 1 :(得分:0)

实现这一目标的方法有很多种。

我主要使用事件总线进行片段和活动之间的通信。 您可以使用这个备受推荐的活动巴士Otto by Square团队。

http://square.github.io/otto/

您可以FlowPanel Subscribe中的活动Fragment。当您在Activity Produce该事件中获得结果并发送到Fragment时。

答案 2 :(得分:0)

在{strong> MainActivity 中,onCreateView()HomeFragment()与onActivityResult()之间似乎存在时间问题。 Google建议使用 Bundle 作为数据参数,使用接口进行Activity和Fragment之间的通信。设置起来并不难,并且在您的应用程序中为其他目的提供了很好的知识。

无论如何,我在过去发布了一个答案,并详细解释了@ Passing data between fragments contained in an activity(搜索我的用户名,如果没有立即找到)。 我想在Google网页@ Communicating with Other Fragments中显示一个片段,即将数据发送到片段的示例:

// Create fragment and give it an argument for the selected article
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);

答案 3 :(得分:0)

我只想到了另一个,可能更好,更容易的答案。由于您依赖 HomeFragment onCreateView(),因此您可以通过newInstance()传递数据。 Google网页@ Fragment。搜索&#34;静态MyFragment newInstance&#34;的文本就是一个很好的例子。对于活动,搜索文本&#34; Fragment newFragment = MyFragment.newInstance(&#34; From Arguments&#34;)&#34;。 HomeFragment网页的代码段:

public static class MyFragment extends Fragment {
    CharSequence mLabel;

    /**
     * Create a new instance of MyFragment that will be initialized
     * with the given arguments.
     */
    static MyFragment newInstance(CharSequence label) {
        MyFragment f = new MyFragment();
        Bundle b = new Bundle();
        b.putCharSequence("label", label);
        f.setArguments(b);
        return f;
    }

对于活动:

@Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_arguments);

    if (savedInstanceState == null) {
        // First-time init; create fragment to embed in activity.
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        Fragment newFragment = MyFragment.newInstance("From Arguments");
        ft.add(R.id.created, newFragment);
        ft.commit();
    }
}

我相信你可以自己轻松替换代码。您的代码显示了对Android的良好理解。 祝你好运,玩得开心,让我们发布...

答案 4 :(得分:0)

问题是导航抽屉的主菜单中的菜单不在homefragment中。所以onActivityResult指向mainactivity而不是我的HomeFragment。将菜单更改为HomeFragment后解决了我的问题。

感谢帮助我的所有人:)