Activity向fragment传值的问题

阿弎 2016-04-03 08:46:13
我用了ActionBar.TabListener 来实现fragment的切换 ,但是用main_Activity向fragment传递数据时就会报空指针错误[使用的是setArguments(bundle); 方法]、 如果我注释掉ActionBar.TabListener来初始化fragment 而直接用transaction.replace(android.R.id.content, nowFragement,"now");则正确执行... 不知道该怎么办 Activity向fragment传值还有其他方法吗?



//添加tab选项

Tab tab=actionBar.newTab().setText("当前天气")
.setTabListener(new TabListener<NowFragement>(activity,"now" , NowFragement.class));
actionBar.addTab(tab);

tab=actionBar.newTab().setText("未来天气")
.setTabListener(new TabListener<FutureFragement>(activity, "future", FutureFragement.class));
actionBar.addTab(tab);

tab=actionBar.newTab().setText("出行建议")
.setTabListener(new TabListener<SuggestionFragement>(activity, "suggestion", SuggestionFragement.class));
actionBar.addTab(tab);







NowFragement nowFragement=new NowFragement();
Bundle bundle=new Bundle();

// //bundle.putSerializable("nowinfo", weather);
bundle.putString("user", "城市");
nowFragement.setArguments(bundle);
transaction.replace(android.R.id.content, nowFragement,"now");

transaction.commit();


public TabListener(Activity activity,String tag,Class<T> clz){
mActivity=activity;
mtag=tag;
myclass=clz;
}


@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
// Check if the fragment is already initialized
if(mFragment==null){
mFragment=Fragment.instantiate(mActivity, myclass.getName());
ft.add(android.R.id.content, mFragment, mtag);
}
else{
ft.attach(mFragment); //// If it exists, simply attach it in order to show it
}
}


...全文
327 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ESC尛蜜蜂 2016-04-05
  • 打赏
  • 举报
回复
handler处理的是耗时进程,肯定是你system.out的时候进程还没处理完,才导致你理解的未进行赋值。
阿弎 2016-04-04
  • 打赏
  • 举报
回复
经过自己的不断测试与思考!!问题已得到解决。。。 我之所以要用到Activity的全局变量 是因为想直接在fragment中得到它的值 再进行更新fragment中的控件数据 【因为对于TAB的不了解 导致在Activity中使用bundle传值总是失败 所以在不得已用此方法】 后再TAB中的ONselected中能够使用 发现FT变量就是fragment的事务处理 之前太粗心了 没有仔细研究 现在就可以只在这个方法中写一次代码 不同的fragment都能得到Activity的全局变量值了 就不用在每个fragment中都写得到Activity全局变量的代码了 在handler中无法直接改变全局变量的值 后加了上了get/set方法 并直接用内部类子线程中修改 。不使用handler 问题得到解决! 貌似handler只能修改UI控件中的值
阿弎 2016-04-04
  • 打赏
  • 举报
回复
如果我在handler中输出 结果就会正确 在Activity中输出就不对。。。这等于定义了两个变量 难道是因为同步的问题吗??
	  WEATHER=msg.obj;
				  Test="sssss";
				 // System.out.println(weather.getBasic().getCity());
				  System.out.println(Test+"LLLL"); 
输出结果:sssssLLLLL
阿弎 2016-04-04
  • 打赏
  • 举报
回复
我进行了转换也不行 。。 比如我用Test字符串来测试 打印出来的还是之前的值
private String Test="";   //定义在Activity中的全局变量

	super.handleMessage(msg);
			if(msg.obj!=null){

			  if(msg.obj.toString()=="no"){ //没有查询到城市
				  //System.out.println(msg.obj.toString()+"成功");
				  Toast.makeText(MainActivity.this, "暂未统计该城市", Toast.LENGTH_LONG).show();
				}
			  else{
				  WEATHER=msg.obj;
				  Test="sssss";    //修改变量  打打印出来的还是为""
				 // System.out.println(weather.getBasic().getCity());
			  }


System.out.println(Test+"LLLL"); 打印输出结果:04-04 06:48:15.626: I/System.out(2923): LLLL // 没有SSSS
wei220000 2016-04-04
  • 打赏
  • 举报
回复
WEATHER=(WEATHER)msg.obj; 类型转换
阿弎 2016-04-04
  • 打赏
  • 举报
回复
以上问题自己已经解决了!!! 但是又遇到新问题了!我搜了很多资料 发现都没类似的问题 问题: 我从网络上得到了数据 msg.obj=网络数据 然后sendMessage() 在handleMessage中将网络数据赋值给Activity中的全局变量 总是报空指针错误 修改不了 该怎么解决啊 困扰我很久了!!!

public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			
			super.handleMessage(msg);
			if(msg.obj!=null){

			  if(msg.obj.toString()=="no"){ //没有查询到城市
				  //System.out.println(msg.obj.toString()+"成功");
				  Toast.makeText(MainActivity.this, "暂未统计该城市", Toast.LENGTH_LONG).show();
				}
			  else{
				  WEATHER=msg.obj;
				 
				  
				 // System.out.println(weather.getBasic().getCity());
			  }
           }



其中WEATHER没有改变 打印其中的值 报空指针 也就是说这个handler没能成功修改avtivity中全局变量的值。

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧