Я знаю, что здесь есть похожие вопросы, но мне нужно знать, что делать в моем случае использования.
я получил ошибкуОшибка Android Fragment при изменении ориентации
make sure class name exists, is public, and has an empty constructor that is public
Это потому, что мои inner Fragment Class
потребности быть static
и вернуть экземпляр. У меня есть обработка экрана в setScreens() method
, которая ломается, когда я устанавливаю ее в static, что я должен делать, если я хочу называть ее из статического фрагмента.
Поскольку я использую GlobalState
расширяющее приложение, для сохранения моего выбора, и он показывает ошибки при доступе к R.id.
мне это нужно, потому что мне нужно получить доступ к данным в различных классах!
Это выдержка из основного класса, мне позже нужно сделать это с помощью 4 фрагментов.
//imports ...
public class MainScreen extends FragmentActivity{
GlobalState globalState;
String statute,section;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GlobalState globalState = (GlobalState)getApplication();
try {
statute = globalState.getStatute();
section = globalState.getSection();
}catch (NullPointerException e){}
setScreens();
}
public void setScreens(){
GlobalState globalState = (GlobalState)getApplication();
try {
statute = globalState.getStatute();
section = globalState.getSection();
}catch (NullPointerException e){e.printStackTrace();}
int i = getLowestSelection();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
//setting up for Landscape
//if (findViewById(R.id.fragtwo) != null) ...
//setting up for portrait
if (findViewById(R.id.fragone) != null) {
if (i == 0){
StatuteScreen statuteScreenFragment = new StatuteScreen(); //External Class, no problem
transaction.replace(R.id.fragone,statuteScreenFragment);
}
else if (i == 1){
SectionsScreen sectionsScreenFragment = new SectionsScreen();//Inner Class throws the error
transaction.replace(R.id.fragone,sectionsScreenFragment);
}
}
transaction.addToBackStack(null);
transaction.commit();
}
public class SectionsScreen extends Fragment{
String title;
ArrayList<DetailData> dataList;
ListView listView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.sections,container,false);
listView = (ListView)view.findViewById(R.id.lvSections);
DataBaseHelper dataBaseHelper = new DataBaseHelper(getActivity());
globalState = (GlobalState)getActivity(). getApplication();
try {
title = globalState.getStatute();
} catch (NullPointerException e){};
if(title != null){
dataList = dataBaseHelper.getDetailsNames(title);
dataBaseHelper.close();
listView.setAdapter(new SectionsAdapter(getActivity(),dataList));
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
globalState.setSection(dataList.get(i).getAbsch());
setScreens();
}
});
}
return view;
}
}
}
Как я могу заставить это работать, чтобы он не падал при изменении ориентации? Могу ли я получить Globalstate
и R.id
от статического метода?
ok thx для обратной связи. Сначала у меня были фрагменты в их собственных файлах. Но мне все они нужны, чтобы вызвать метод setScreens, и мысль, использующая внутренние классы, - это путь. Не был уверен, могу ли я реализовать обратные вызовы из всех 4 фрагментов в Основной деятельности. – M4tchB0X3r
Прочтите документацию (см. Выше), и вы найдете правильный способ сделать все это. –
Будет делать. Я предполагаю, что я буду реализовывать интерфейсы обратного вызова всех фрагментов. Я думал, что это было чище, если бы все было в одном месте. Но имеет смысл, я думаю. – M4tchB0X3r