无法实例化Fragment

hun*_*erp 24 android android-fragments

无法实例化片段确保类名存在,是公共的,并且具有公共的空构造函数

是因为我的片段不是静态类吗?是因为我的片段是一个内在阶级?

如果我将Fragment设为静态类,那么我对findViewById的所有引用都会失败,这意味着很多重构.

如何在不将内部Fragment变成静态类的情况下解决这个问题?

Com*_*are 26

是因为我的片段是一个内在的阶级

如果您的片段是内部类,则它必须是静态内部类.理想情况下,它是一个独立的公共Java类.

如果我使我的Fragment成为一个静态类,我对findViewById的所有引用都会失败,这意味着很多重构

无论如何,你需要进行重构.窗口小部件现在由片段拥有,而不是活动.片段应该尽可能少地了解包含它们的活动,因此可以根据需要在不同的活动之间进行洗牌,以支持手机,平板电脑,电视等.

如何在不将内部Fragment变为静态类的情况下解决这个问题?

您将其设置为独立的公共Java类.


Asa*_*ssi 15

您的Fragment不应该有构造函数(请参阅此文档及其示例).

你应该newInstance()定义一个静态方法并通过参数传递任何参数(bundle)

例如:

public static final MyFragment newInstance(int title, String message)
{
    MyFragment fragment = new MyFragment();
    Bundle bundle = new Bundle(2);
    bundle.putInt(EXTRA_TITLE, title);
    bundle.putString(EXTRA_MESSAGE, message);
    fragment.setArguments(bundle);
    return fragment ;
}
Run Code Online (Sandbox Code Playgroud)

并在onCreate上阅读这些参数:

@Override
public Dialog onCreate(Bundle savedInstanceState)
{
    title = getArguments().getInt(EXTRA_TITLE);
    message = getArguments().getString(EXTRA_MESSAGE);

    //...
    //etc
    //...
}
Run Code Online (Sandbox Code Playgroud)

这种方式如果分离并重新附加对象状态可以通过参数存储,就像附加到Intents的bundle一样.


PJL*_*PJL 10

正如CommonsWare所说的那样,让它静态或独立,另外不知道为什么你需要重新开始重构findViewById才能上班.建议:

使用膨胀的视图onCreateView,

inflatedView.findViewById(.....)
Run Code Online (Sandbox Code Playgroud)

或称之为 onActivityCreated(.....)

getActivity().findViewById(......)
Run Code Online (Sandbox Code Playgroud)

但是,即使你仍然需要大量的重构,那可能就是这样,将应用程序转换为使用片段并不是免费的,只需完成一个项目即可.