#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 не является общедоступным классом и т. Д
что не так?
Обновить
Спасибо сэру Миро за указание на основную проблему в моем коде в его ответе. Я просто хочу прояснить некоторые вопросы здесь:
- прежде всего, я не знал, что при размещении фрагмента в xml-макете для класса fragment потребуется предоставить пустой конструктор, поэтому я всегда получаю ошибку instantiate exception в logcat
-
причина, по которой я не поместил пустой конструктор в свой класс fragment, заключается в том, что из-за моих предыдущих попыток создания фрагментов я успешно отображал фрагменты с помощью непустого конструктора, и я обычно добавляю параметры activity внутри него для использования контекста в классе fragment. но я не заметил, что ни один из этих фрагментов не был объявлен в моем XML-макете! и вот тогда начинает появляться ошибка
-
итак, в заключение мы должны предоставить пустой конструктор или вообще не иметь конструктора, если мы объявили фрагменты в нашем 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. спасибо, что указали на проблему, теперь я знаю детали, которые происходят в моем коде