0

我对Android很陌生,有一个我想实现的目标,但目前我找不到合适的解决方案。

我正在使用 Android 进行开发,我需要一个 Activity 来显示带有圆角的 2D 矩形的二维网格。网格的大小在运行时确定并从父 Activity 转发。这意味着我还必须在运行时创建矩形。由于矩形还需要自定义行为,我尝试了以下操作:

我确实编写了自己的类并且确实从 View 继承。在onDraw()方法中,我定义了矩形的外观,尽管一开始我想在 ShapeDrawable XML 文件中定义外观并将其加载到我的自定义矩形的构造中。那效果不好。现在我被卡住了,因为当我尝试将我的视图添加到与活动关联的布局以显示网格时,我得到了错误。当我直接设置其中一个矩形时,setContentView(rectangle)它会显示在屏幕中间的某个位置。

所以我的问题是:

  • 通过从 View 继承来创建这些矩形是否正确?(请记住,当用户单击矩形时,我必须修改绘制方式,并且我想稍后在单击矩形时打开菜单)

  • 显示这些矩形的最佳方式是什么?当我想以类似网格的方式显示它们时应该使用哪种布局?用户稍后也应该能够删除一些矩形。因此,网格中必须有可能存在间隙

  • 由于使用此代码将矩形添加到布局中不起作用,我应该怎么做(我使用了 LinearLayout)?

    ViewGroup layout = (ViewGroup) findViewById(R.id.conf_new_solar_plant_layout);
    SolarPanelView spView = new SolarPanelView(this);
    spView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    layout.addView(spView)
    

我收到的错误如下:

    11-06 11:41:49.862: E/AndroidRuntime(2203): FATAL EXCEPTION: main
    11-06 11:41:49.862: E/AndroidRuntime(2203): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.smartexergy.app/com.smartexergy.app.ConfNewSolarPlantActivity}: java.lang.NullPointerException
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2194)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2229)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at android.app.ActivityThread.access$600(ActivityThread.java:139)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1261)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at android.os.Handler.dispatchMessage(Handler.java:99)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at android.os.Looper.loop(Looper.java:154)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at android.app.ActivityThread.main(ActivityThread.java:4944)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at java.lang.reflect.Method.invokeNative(Native Method)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at java.lang.reflect.Method.invoke(Method.java:511)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at dalvik.system.NativeStart.main(Native Method)
    11-06 11:41:49.862: E/AndroidRuntime(2203): Caused by: java.lang.NullPointerException
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at com.smartexergy.app.ConfNewSolarPlantActivity.onCreate(ConfNewSolarPlantActivity.java:34)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at android.app.Activity.performCreate(Activity.java:4531)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1071)
    11-06 11:41:49.862: E/AndroidRuntime(2203):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2150)

谢谢!

编辑:修复了错误,我忘记将布局设置为 contentView。其余的问题仍然存在。

4

1 回答 1

0

我继续做一些研究,在我的特殊情况下,我确实发现它是编写我自己的扩展 ImageView 的 iew 类的最简单也是正确的方法。在 ImageView 中,我确实重写了 onDraw() 方法来获得我的自定义形状和设计。

为了在网格中显示这些视图,我使用了 GridLayout 并以编程方式添加了我的自定义视图。在 GridLayout 中,可以为每个项目提供 ax 和 y 坐标。关于间隙,我目前不太确定,但如果不可能,我将添加“空间”对象以具有空白间隙。

单击事件在 ImageView 中很容易捕获,但我认为在 GridLayout 中也应该可以,因此我可以处理矩形的移动和删除。

于 2013-11-11T14:09:28.407 回答