将参数从Android FragmentActivity传递到Fragment

时间:2012-10-13 13:39:02

标签: android parameters fragment android-fragmentactivity

当我试图将一个参数从FragmentActivity传递给Fragment时,它在片段中的getArguments()中给出了空指针异常。

这是我的FragmentActivity Code

  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_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >

    <fragment
        android:id="@+id/header_fragment"
        android:name="com.lk.ignitionit.cse.util.HeaderFragmentActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <fragment
        android:id="@+id/index_fragment"
        android:name="com.lk.ignitionit.cse.util.IndexFragmentActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <fragment
        android:name="com.lk.ignitionit.cse.util.ChartFragmentActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</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)

我提到了很多与此相关的stackoverflow问题,并尝试了给出http://developer.android.com/guide/components/fragments.html的示例代码。但仍然没有运气

真的很感激任何反馈,因为这似乎是一个我无法弄清楚的基本问题..

先谢谢

1 个答案:

答案 0 :(得分:18)

  1. 从所有未从Activity继承的类的名称中删除Activity。例如, IndexFragmentActivity不是Activity

  2. 在您实际活动的onCreate()中,您正在调用findFragmentById()来检索片段,然后在该片段上调用newInstance()。但是,在第一次调用onCreate()时,该片段将不存在,并且您将使用NullPointerException失败。请正确处理此案例。

  3. Java中的方法名称newInstance通常与factory pattern相关联,其中newInstance()是用于代替公共构造函数的static方法创建某个类的实例。您的newInstance()方法不是static。这会让那些跟随你的人维持代码混淆。

  4. 您在newInstance()中调用onCreate(),创建新的片段实例,然后将其丢弃,这是浪费时间。

  5. 因此,假设您的片段的原始实例(无论它来自何处)没有设置参数Bundle,这将解释NullPointerException中的getSelectedIndex()

      

    当我试图将参数从FragmentActivity传递给片段

    使用static newInstance()方法和参数Bundle将参数传递给新创建的片段,以创建 new 片段是完全合理的。

    要将参数传递给已存在的片段,只需在该片段上调用一些setter方法。