尝试将FrameLayout强制转换为子类时出现ClassCastException

时间:2015-08-10 18:37:00

标签: java android

在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

我该如何解决这个问题?

1 个答案:

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