Передача параметров из Android FragmentActivity во фрагмент

Когда я пытаюсь передать параметр из FragmentActivity во фрагмент, это дает мне исключение нулевого указателя в 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_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. Но все равно не повезло

Очень ценю любую обратную связь по этому поводу, так как это кажется очень простой проблемой, которую я не могу понять.

Заранее спасибо


person virtualpathum    schedule 13.10.2012    source источник


Ответы (1)


  1. Избавьтесь от Activity в именах всех классов, которые не наследуются от Activity. Например, IndexFragmentActivity не является Activity.

  2. В onCreate() вашей реальной деятельности вы вызываете findFragmentById() для извлечения фрагмента, а затем вызываете newInstance() для этого фрагмента. Однако фрагмент не будет существовать при первом вызове onCreate(), и здесь вы потерпите неудачу с NullPointerException. Пожалуйста, правильно рассмотрите этот случай.

  3. Имя метода newInstance в Java чаще всего ассоциируется с фабричным шаблоном, где newInstance() – метод static. используется вместо общедоступного конструктора для создания экземпляров некоторого класса. Ваш newInstance() метод не static. Это вызовет путаницу у тех, кто придет после вас, чтобы поддерживать код.

  4. Вы вызываете newInstance() в onCreate(), создаете новый экземпляр фрагмента, а затем выбрасываете его, что является пустой тратой времени.

Следовательно, предполагая, что ваш исходный экземпляр вашего фрагмента (откуда бы он ни пришел) не имеет набора аргументов Bundle, это объясняет ваш NullPointerException в getSelectedIndex().

Когда я пытаюсь передать параметр из FragmentActivity во фрагмент

Чтобы передать параметр во ново созданный фрагмент, вполне разумно использовать метод static newInstance() и аргументы Bundle для создания нового фрагмента.

Чтобы передать параметр уже существующему фрагменту, просто вызовите некоторый метод установки для этого фрагмента.

person CommonsWare    schedule 13.10.2012
comment
Большое спасибо за ваших гидов. Я поработаю и обновлю ответы, как только решу проблему. - person virtualpathum; 15.10.2012