Android:无法在XML中实例化自定义视图

时间:2013-07-18 23:10:08

标签: android eclipse android-layout android-view

我有一个自定义视图(CoordinateGridView),我在XML布局中使用(activity_trajectory.xml):

  <com.android.catvehicle.CoordinateGridView
        android:id="@+id/coordinateGrid"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true" />

我在图形编辑器中收到此错误:**。CoordinateGridView无法实例化。

Error in Android Graphical Editor http://i42.tinypic.com/2w3b9f5.png

这是我在自定义视图中的构造函数:

public CoordinateGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setFocusable(true);
        setFocusableInTouchMode(true);
        this.setOnTouchListener(this);
        hostActivity = (TrajectoryActivity) this.getContext();
}

这是我在其中使用CoordinateGridView设置布局的Activity:

public class TrajectoryActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        removeActionBar();
        setContentView(R.layout.activity_trajectory);
        initializeViews();
        loadSettings();
    }
}

有关此问题的任何想法吗?令人沮丧的是无法在图形编辑器中看到任何内容,因为我的自定义视图阻止了布局中的所有其他视图......

2 个答案:

答案 0 :(得分:6)

您在图形布局中出现错误的原因是图形编辑器尝试使用它自己的Context实例化您的视图并且它获得ClassCastException。因此,如果视图处于编辑模式,则应使用View.isInEditMode()取消隐藏,然后跳过不必要的步骤。例如:

public CoordinateGridView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setFocusable(true);
    setFocusableInTouchMode(true);
    this.setOnTouchListener(this);
    if (!isInEditMode()) hostActivity = (TrajectoryActivity) this.getContext();
}

和你应该在其他地方使用同样的东西,你使用hostActivity

答案 1 :(得分:0)

我使用Android Holo ColorPicker时遇到了完全相同的问题。

问题是由Manifest xml-file中声明的API版本引起的。

我将android:minSdkVersion =“11”更改为android:minSdkVersion =“8”并且问题已经消失。