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