默认情况下我创建了一个导航抽屉,用于创建我的主片段启动。现在从我的主要活动开始,我将进入下一个活动,在那里我执行一些操作并使用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;
}
}
我没有收到任何错误,列表视图也没有显示。请告诉我。
答案 0 :(得分:0)
从我所看到的,你永远不会将你的适配器设置为listView。
因此,在创建新的AdapterListViewData和执行.notifyDataSetChanged()之间添加以下内容
listViewData.setAdapter(adapterListViewData);
答案 1 :(得分:0)
实现这一目标的方法有很多种。
我主要使用事件总线进行片段和活动之间的通信。 您可以使用这个备受推荐的活动巴士Otto by Square团队。
您可以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后解决了我的问题。
感谢帮助我的所有人:)