0

私はAndroidの初心者で、達成したい目標がありますが、現時点では適切な解決策を見つけることができません。

私は Android で開発しており、角の丸い2D 四角形の 2 次元グリッドを表示するアクティビティが必要です。グリッドのサイズは実行時に決定され、親アクティビティから転送されます。つまり、実行時に長方形も作成する必要があります。長方形にもカスタム動作が必要なため、次のことを試しました。

私は独自のクラスを作成し、View から継承しました。このonDraw()メソッドでは、最初は ShapeDrawable XML ファイルで外観を定義し、それをカスタム四角形の構築にロードしたかったにもかかわらず、四角形がどのように見えるかを定義しました。それはうまくいきませんでした。アクティビティに割り当てられたレイアウトにビューを追加してグリッドを表示しようとすると、エラーが発生するため、行き詰まりました。これらの長方形の 1 つを直接設定すると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 に答える