在Android中,我有一个ListFragment。在ListFragment上我想存储一个自定义视图对象,我打算在其上做一些进一步的工作。因为看起来从OnCreateView返回的View对象的类型是FrameLayout,所以我将自定义视图对象定义为从FrameLayout派生。
所以,基本上我的自定义视图类看起来像:
@Override
protected String doInBackground (String...sUrl){
......
File sd = Environment.getExternalStorageDirectory();
File outputFile = new File(sd, "/download/update.apk");
output = new FileOutputStream(outputFile);
......
}
@Override
protected void onPostExecute(String result) {
......
File sd = Environment.getExternalStorageDirectory();
File inputFile = new File(sd, "/download/update.apk");
Intent promptInstall = new Intent(Intent.ACTION_VIEW);
promptInstall.setDataAndType(Uri.fromFile(inputFile), "application/vnd.android.package-archive");
promptInstall.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
promptInstall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(promptInstall);
......
}
我的ListFragment实现中的MyCreateView方法如下所示:
public class MyCustomView extends FrameLayout {
public MyCustomView(Context context) { super(context); }
public MyCustomView(Context context, AttributeSet attrs) { super(context, attrs); }
public MyCustomView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }
public MyCustomView(Context context, AttributeSet attrs, int defStyle, int defStyleRes) { super(context, attrs, defStyle, defStyleRes); }
}
但是使用这段代码我得到一个异常:java.lang.ClassCastException:android.widget.FrameLayout无法强制转换为... myApp.MyCustomView
我该如何解决这个问题?
答案 0 :(得分:2)
您无法在任何地方使用MyCustomView
。
当你致电super.onCreateView(inflater, container, savedInstanceState);
时,你让基类(ListFragment
)处理为你的片段创建布局,而框架的ListFragment
类并不知道您创建了MyCustomView
或如何使用它。
相反,您需要创建一个使用MyCustomView
的布局XML文件,并改为扩充该布局。你最终会得到这样的东西:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
getActivity(), android.R.layout.simple_list_item_1,
new String[]{ "one", "two", "three"});
setListAdapter(adapter);
View layout = inflater.inflate(R.layout.list_fragment_layout, container, false);
MyCustomView myView = (MyCustomView) layout.findViewById(R.id.custom_view_id);
return layout;
}