make Simple Fragment всегда получает исключение InstantiationException

#android #fragment

#Android #фрагмент

Вопрос:

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

 public class MainActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    Fragment testFragment = manager.findFragmentById(R.id.listTestFragment);
    transaction.show(testFragment);
    transaction.commit();
}

}
  

и мой activity_main.xml

 <?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent" 
android:layout_height="match_parent">

<fragment android:name="com.drikvy.testfragmentgame.ListTestFragment"
        android:id="@ id/listTestFragment" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" />


</LinearLayout>
  

и мой ListTestFragment.java

 public class ListTestFragment extends Fragment {

String[] data = {"aaaa", "bbbb", "cccc", "dddd"};
MainActivity activity;

public ListTestFragment(MainActivity activity) {
    this.activity = activity;
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
            View view = inflater.inflate(R.layout.fragment_lores_list, null, false);

            ListView lvLores = (ListView) view.findViewById(R.id.lv_saved_lores);
            lvLores.setAdapter(new ArrayAdapter<String>(activity, android.R.id.text1, data));

            return view;
}
}
  

к сожалению, среда выполнения Android сказала, что у меня нет пустого конструктора и что мой класс fragment не является общедоступным классом и т. Д
что не так?

Обновить

Спасибо сэру Миро за указание на основную проблему в моем коде в его ответе. Я просто хочу прояснить некоторые вопросы здесь:

  1. прежде всего, я не знал, что при размещении фрагмента в xml-макете для класса fragment потребуется предоставить пустой конструктор, поэтому я всегда получаю ошибку instantiate exception в logcat
  2. причина, по которой я не поместил пустой конструктор в свой класс fragment, заключается в том, что из-за моих предыдущих попыток создания фрагментов я успешно отображал фрагменты с помощью непустого конструктора, и я обычно добавляю параметры activity внутри него для использования контекста в классе fragment. но я не заметил, что ни один из этих фрагментов не был объявлен в моем XML-макете! и вот тогда начинает появляться ошибка

  3. итак, в заключение мы должны предоставить пустой конструктор или вообще не иметь конструктора, если мы объявили фрагменты в нашем XML-макете. но если мы не объявили их в нашем XML-макете, тогда мы можем намеренно добавить любые конструкторы с любыми параметрами, которые мы могли бы захотеть в нашем классе fragment!

Комментарии:

1. используйте View view = inflater.раздуть(R.макет. fragment_lores_list, контейнер, false); вместо использования View view = inflater.inflate(R.layout. fragment_lores_list, null, false);

Ответ №1:

Вы не можете передать свою активность из конструктора fragment. Fragment имеет вызываемый метод onAttach , который вызывается, когда фрагмент присоединяется к действию. Вы можете установить activity переменную из onAttach .

Попробуйте это в качестве вашего Fragment кода:

 public class ListTestFragment extends Fragment {

    String[] data = {"aaaa", "bbbb", "cccc", "dddd"};
    MainActivity activity;

    public ListTestFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.fragment_lores_list, null, false);

        ListView lvLores = (ListView) view.findViewById(R.id.lv_saved_lores);
        lvLores.setAdapter(new ArrayAdapter<String>(activity, android.R.id.text1, data));

        return view;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.activity = (MainActivity) activity;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        this.activity = null;
    }
}
  

И также вам не понадобится весь этот код в вашей деятельности. Android автоматически инициализирует и покажет фрагмент для вас.

Комментарии:

1. нет, все еще ошибка … я добавлял mainactivity в constructor к другим фрагментам, и все они просто прекрасны …, не знаю, что происходит с этим…

2. кстати, после копирования вашего кода я получил эту ошибку E / AndroidRuntime (21254): android.content.res.Resources$ NotFoundException: Файл с идентификатором ресурса макета типа xml #0x1020014

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

4. спасибо, что указали на проблему, теперь я знаю детали, которые происходят в моем коде