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

Tar*_*que 3 eclipse android 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" />
Run Code Online (Sandbox Code Playgroud)

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

Android图形编辑器出错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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Des*_*ert 6

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

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

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