将参数从 Android FragmentActivity 传递给 Fragment
Posted
技术标签:
【中文标题】将参数从 Android FragmentActivity 传递给 Fragment【英文标题】:Passing parameters from Android FragmentActivity to Fragment 【发布时间】:2012-10-04 03:05:46 【问题描述】:当我尝试将参数从 FragmentActivity 传递给 Fragment 时,它会在 Fragment 的 getArguments() 中出现空指针异常。
这是我的 FragmentActivity 代码
public class IndexChartActivity extends FragmentActivity
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.index_chart);
IndexFragmentActivity indexFragment =
(IndexFragmentActivity)getSupportFragmentManager().findFragmentById(R.id.index_fragment);
indexFragment.newInstance("ASPI");
这里是 index_chart.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:background="#FFFFFF"
android:orientation="vertical" >
<fragment
android:id="@+id/header_fragment"
android:name="com.lk.ignitionit.cse.util.HeaderFragmentActivity"
android:layout_
android:layout_ />
<fragment
android:id="@+id/index_fragment"
android:name="com.lk.ignitionit.cse.util.IndexFragmentActivity"
android:layout_
android:layout_ />
<fragment
android:name="com.lk.ignitionit.cse.util.ChartFragmentActivity"
android:layout_
android:layout_ />
</LinearLayout>
这是片段
public class IndexFragmentActivity extends Fragment
protected ImageView ivASPI;
protected ImageView ivMPI;
protected ImageView ivSP;
protected TextView tvMain;
protected TextView tvTop;
protected TextView tvBottom;
String response = null;
String result = null;
String [] resultArr = null;
Bundle b = new Bundle();
String indexType = null;
int layout;
IndexFragmentActivity f = null;
public IndexFragmentActivity newInstance(String index)
f = new IndexFragmentActivity();
Bundle args = new Bundle();
args.putString("indextype", index);
f.setArguments(args);
return f;
public String getSelectedIndex()
return f.getArguments().getString("indextype");
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
if(getSelectedIndex().equals("ASPI"))
layout = R.layout.aspi_header;
else if(getSelectedIndex().equals("MPI"))
layout = R.layout.mpi_header;
else
layout = R.layout.sp_header;
View view = inflater.inflate(layout, container, false);
tvMain = (TextView) view.findViewById(R.id.tv_main);
tvTop = (TextView) view.findViewById(R.id.tv_top);
tvBottom = (TextView) view.findViewById(R.id.tv_bottom);
new ServiceAccess().execute("");
tvMain.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
b.putString("type", "S&P SL20");
Activity activity = getActivity();
Intent intent = new Intent(activity, IndexChartActivity.class);
intent.putExtras(b);
startActivity(intent);
);
return view;
这是我的错误
Caused by: java.lang.NullPointerException
at com.lk.ignitionit.cse.util.IndexFragmentActivity.getSelectedIndex(IndexFragmentActivity.java:69)
我提到了很多与此相关的 *** 问题,并尝试了给定 http://developer.android.com/guide/components/fragments.html 的示例代码。但还是没有运气
非常感谢对此的任何反馈,因为这似乎是一个我无法弄清楚的非常基本的问题..
提前致谢
【问题讨论】:
【参考方案1】:从所有不继承自Activity
的类的名称中去掉Activity
。例如,
IndexFragmentActivity
不是 Activity
。
在实际活动的onCreate()
中,您调用findFragmentById()
来检索片段,然后在该片段上调用newInstance()
。但是,第一次调用onCreate()
时,该片段将不存在,您将在此处失败并返回NullPointerException
。请正确处理此案。
Java 中的方法名称newInstance
最常与factory pattern 相关联,其中newInstance()
是一个static
方法,用于代替公共构造函数来创建某些类的实例。您的 newInstance()
方法不是 static
。这会让那些追随您维护代码的人感到困惑。
你在onCreate()
中调用newInstance()
,创建新的fragment实例,然后扔掉,浪费时间。
因此,假设您的片段的原始实例(无论它来自何处)没有设置参数Bundle
,这将解释您在getSelectedIndex()
中的NullPointerException
。
当我尝试将参数从 FragmentActivity 传递到 Fragment 时
将参数传递给新创建的片段,使用static
newInstance()
方法和参数Bundle
来创建新片段是完全合理的.
要将参数传递给已经存在的片段,只需在该片段上调用一些 setter 方法。
【讨论】:
非常感谢您的指导。解决问题后,我会继续工作并更新答案。以上是关于将参数从 Android FragmentActivity 传递给 Fragment的主要内容,如果未能解决你的问题,请参考以下文章
Android:将参数从Activity传递给Service
将参数从 Android FragmentActivity 传递给 Fragment
从 Android 向 .net Restful WebService 发送参数