4

When Im trying to pass a parameter from FragmentActivity to a Fragment it gives me null pointer exception in the getArguments() in the Fragment.

Here is my 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");

        }

    }

Here is the 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>

and Here is the Fragment

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;
    }
}

and Here is my ERROR

Caused by: java.lang.NullPointerException
at com.lk.ignitionit.cse.util.IndexFragmentActivity.getSelectedIndex(IndexFragmentActivity.java:69)

I referred lots of stackoverflow questions relevant to this and tried the sample code given http://developer.android.com/guide/components/fragments.html as well. But still no luck

Really appreciate any feed back on this as this seems to be a very basic issue which I cannot figure out..

Thanks in Advance

4

1 回答 1

18
  1. Get rid of Activity from the names of all classes that do not inherit from Activity. For example, IndexFragmentActivity is not an Activity.

  2. In onCreate() of your actual activity, you are calling findFragmentById() to retrieve a fragment, then calling newInstance() on that fragment. However, the fragment will not exist the first time onCreate() is called, and you will fail here with a NullPointerException. Please correctly handle this case.

  3. The method name newInstance in Java is most commonly associated with the factory pattern, where newInstance() is a static method used in place of a public constructor to create instances of some class. Your newInstance() method is not static. This will cause confusion for those who come after you to maintain the code.

  4. You call newInstance() in onCreate(), create the new fragment instance, and then throw it away, which is a waste of time.

Hence, assuming that your original instance of your fragment (wherever it came from) does not have an arguments Bundle set, that would explain your NullPointerException in getSelectedIndex().

When Im trying to pass a parameter from FragmentActivity to a Fragment

To pass a parameter to a newly created fragment, using a static newInstance() method and the arguments Bundle to create the new fragment is perfectly reasonable.

To pass a parameter to a fragment that already exists, simply call some setter method on that fragment.

于 2012-10-13T15:35:12.340 回答