【问题标题】:Android Fragment error on Orientation Change方向更改时的Android Fragment错误
【发布时间】:2023-04-08 07:34:01
【问题描述】:

我知道这里有类似的问题,但我需要知道在我的用例中该怎么做。
我得到了错误

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;
        }
    }
}

我怎样才能让它工作,所以它不会在方向改变时崩溃? 我可以从静态方法中获取GlobalstateR.id 吗?

【问题讨论】:

    标签: android static android-fragments screen-orientation


    【解决方案1】:

    你做错了。

    我强烈建议您花时间阅读docs on Fragments,尤其是“与活动沟通”部分。您使用 Application 类的方式毫无意义。

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

    我没有看到一个空的公共构造函数......并且如果没有将内部类声明为静态,它将持有对其 Activity 的引用并导致泄漏和其他问题。

    您可以通过将SectionsScreen 重构到它自己的文件中或使用适当的回调模式来避免这一切。

    【讨论】:

    • 好的,感谢您的反馈。起初我在他们自己的文件中保存了这些片段。但是我需要他们都调用 setScreens 方法,并且认为使用内部类是要走的路。不确定我是否可以在 Main Activity 中实现所有 4 个片段的回调。
    • 阅读文档(上面的链接),你会找到做这一切的正确方法。
    • 会做的。我想我会实现所有片段的回调接口。我认为如果我将所有东西都放在一个地方,这会更干净。但我猜是有道理的。
    • 好的,重构和它的工作thx。只是认为有一种内部类的方法
    • @M4tchB0X3r 欢迎您。 Nore:您可以使用内部类,它只需要是静态的。这个问题是你的回调实现(GlobalState/setScreens)。
    猜你喜欢
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多