我知道这里有类似的问题,但我需要知道在我的用例中该怎么做 我收到了错误
make sure class name exists, is public, and has an empty constructor that is public
这是因为我的inner Fragment Class
需要static
并返回一个实例。我在setScreens() method
中进行了我的屏幕处理,当我将其设置为静态时会中断,如果我想从静态片段中调用它,我会这样做。
因为我使用扩展应用程序的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
吗?
答案 0 :(得分:0)
你这样做是错的。
我强烈建议您花点时间阅读docs on Fragments,尤其是“与活动沟通”部分。你使用Application类的方式毫无意义。
确保类名存在,是公共的,并且具有公共
的空构造函数
我没有看到一个空的公共构造函数......并且没有将内部类声明为静态,它将持有对它的Activity的引用并导致泄漏和其他问题。
您可以通过将SectionsScreen
重构为自己的文件或使用正确的回调模式来避免这一切。