方向更改时出现Android碎片错误

方向更改时出现Android碎片错误,android,static,android-fragments,screen-orientation,Android,Static,Android Fragments,Screen Orientation,我知道这里有类似的问题,但我需要知道在我的用例中应该做什么。 我弄错了 确保类名存在,是公共的,并且有一个公共的空构造函数 这是因为我的内部片段类需要是静态的并返回一个实例。我在setScreens()方法中处理了屏幕,当我将其设置为static时,屏幕会中断,如果我想从静态片段调用它,我必须这样做 因为我使用的是扩展应用程序的GlobalState,用于保存我的选择,并且在访问R.id时显示错误。 我需要这个,因为我需要访问不同类中的数据 这是主类的摘录,稍后我需要用4个片段来完成 //imp

我知道这里有类似的问题,但我需要知道在我的用例中应该做什么。
我弄错了

确保类名存在,是公共的,并且有一个公共的空构造函数

这是因为我的
内部片段类
需要是
静态的
并返回一个实例。我在
setScreens()方法中处理了屏幕,当我将其设置为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;
        }
    }
}
//导入。。。
公共类主屏幕扩展了碎片活动{
球态球态;
字符串规约,第节;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GlobalState GlobalState=(GlobalState)getApplication();
试一试{
规约=globalState.get规约();
section=globalState.getSection();
}捕获(NullPointerException e){}
固定筛();
}
公开无效设置筛选(){
GlobalState GlobalState=(GlobalState)getApplication();
试一试{
规约=globalState.get规约();
section=globalState.getSection();
}catch(NullPointerException e){e.printStackTrace();}
int i=getLowestSelection();
FragmentTransaction=getSupportFragmentManager().beginTransaction();
//景观设置
//如果(findviewbyd(R.id.fragtwo)!=null)。。。
//设置肖像
if(findViewById(R.id.fragone)!=null){
如果(i==0){
StatuteScreen StatuteScreen片段=新StatuteScreen();//外部类,没有问题
交易。替换(R.id.fragone,StatuteScreen碎片);
}
else如果(i==1){
SectionsScreen sectionsScreenFragment=new SectionsScreen();//内部类抛出错误
事务.替换(R.id.fragone,sectionsScreenFragment);
}
}           
transaction.addToBackStack(空);
commit();
}
公共类SectionScreen扩展了片段{
字符串标题;
ArrayList数据表;
列表视图列表视图;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(右布局。截面,容器,假);
listView=(listView)view.findViewById(R.id.lvSections);
DataBaseHelper DataBaseHelper=新的DataBaseHelper(getActivity());
globalState=(globalState)getActivity().getApplication();
试一试{
title=globalState.get规约();
}catch(NullPointerException e){};
如果(标题!=null){
dataList=dataBaseHelper.getDetailsNames(标题);
dataBaseHelper.close();
setAdapter(新的SectionsAdapter(getActivity(),dataList));
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
setSection(dataList.get(i.getAbsch());
固定筛();
}
});
}
返回视图;
}
}
}
我怎样才能让它工作,这样它就不会在方向改变时崩溃?
我可以从静态方法中获取
Globalstate
R.id
吗?

您这样做完全错了

我强烈建议你花点时间阅读这篇文章,尤其是“与活动沟通”一节。您使用应用程序类的方式毫无意义

确保类名存在,是公共的,并且有一个公共的空构造函数

我没有看到空的公共构造函数。。。在不将内部类声明为静态的情况下,它将保留对其活动的引用,并导致泄漏和其他问题


您可以通过将
SectionsScreen
重构到它自己的文件中,或者使用正确的回调模式来避免整个问题。

ok thx以获得反馈。一开始我把这些碎片放在他们自己的档案里。但是我需要它们都调用setScreens方法,而且我认为使用内部类是一种方法。我不确定是否可以从主活动中的所有4个片段实现回调。阅读文档(上面链接),您将找到正确的方法来完成所有这一切。将完成。我想我将实现所有片段的回调接口。我想如果我把所有的东西都放在一个地方,这会更干净。但我想这是有道理的。好吧,重构和它的工作thx。只是觉得有一种方法可以让内心classes@M4tchB0X3r欢迎光临。你可以使用一个内部类,它只需要是静态的。这个问题是您的回调实现(GlobalState/setScreens)。