5

TableLayOut の動的な作成に問題があるのは、私が初めてではないようです。問題は、TableRow オブジェクトを TableLayout に追加すると、Android アプリケーションがクラッシュし、予期しないエラーで終了することです。

私がしたいこと?次のアイテムのレイアウトでダイアログを作成したい

-------------------
|Custom |____|____| <-- Something like property grid
|graphic|____|____|
|view   |____|____|
|       |____|____|
-------------------

閉じるボタン

それを行うために、私は次の方法を使用しています。

1. DialogLayout クラスの作成
2. Dialog クラスの作成

public class DialogLayout extends LinearLayout
{
   private CustomView m_view;
   private TableLayout m_layout;
   private TableRow m_row0;
   private TextView m_propName;
   private EditText m_propValue;

   public DialogLayout(Context context)
   {
        super(context);
        Init(context);
   }

   private void Init(Context context)
   {
      setOrientation(LinearLayout.HORIZONTAL);

      m_layout = new TableLayout(context);
      m_layout.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
      m_layout.setStretchAllColumns(true);

      m_propName= new TextView(context);
      m_propName.setText("PropName:");

      m_propValue = new EditText(context);
      m_propValue.setText("--");

      m_row0 = new TableRow(context);
      m_row0.addView(m_propName);
      m_row0.addView(m_propValue);      
      m_layout.addView(m_row0, new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

m_view= new CustomView(context);
        int h = (int) Math.min(m_layout.getHeight(), 600);
        if (h < 600)
            h = 600;
        LinearLayout.LayoutParams adapt = new LayoutParams(300, h);
        m_view.setLayoutParams(adapt);

        addView(m_view);
        addView(m_layout);

        setFocusable(true);
        setFocusableInTouchMode(true);
   }

}

Dialog class :

public class Dialog
{
        private Builder m_dialog = null;
        private DialogLayout m_layout = null;

        public Dialog(Context context)
        {
            m_layout = new DialogLayout(context);
            m_dialog = new AlertDialog.Builder(context);
            m_dialog.setTitle("My dialog");
            m_dialog.setView(m_layout);
            m_dialog.setNegativeButton("Close button", null);
        }

        public void show()
        {
        m_dialog.show(); // Seems to be it does not correctly calls m_dialog.show()!!!
        }
}

アプリケーションクラッシュの次の理由を確認しました

  1. 私のカスタムビューは大丈夫ですか?- はい、大丈夫です。アプリケーションの動作には何の影響もありません
  2. 他に理由がある場合は?- はい。奇妙なことに、アプリは に入れようとしているときにのみクラッシュm_row0m_layoutます。しかし、コード行にコメントしているとき

    m_layout.addView(m_row0, new TableLayout. LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

すべてが正常に機能し始めますが、テーブルはありません。

よろしくお願いします。

LogCat:

12-12 15:00:45.899: W/dalvikvm(26467): threadid=1: thread exiting with uncaught exception (group=0x40e56930)
12-12 15:00:45.909: E/AndroidRuntime(26467): FATAL EXCEPTION: main
12-12 15:00:45.909: E/AndroidRuntime(26467): java.lang.ArithmeticException: divide by zero
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.TableLayout.mutateColumnsWidth(TableLayout.java:587)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.TableLayout.shrinkAndStretchColumns(TableLayout.java:576)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.TableLayout.measureVertical(TableLayout.java:474)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.TableLayout.onMeasure(TableLayout.java:439)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.View.measure(View.java:15513)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.View.measure(View.java:15513)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.View.measure(View.java:15513)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.View.measure(View.java:15513)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.View.measure(View.java:15513)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.View.measure(View.java:15513)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.View.measure(View.java:15513)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4827)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.View.measure(View.java:15513)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1064)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.Choreographer.doCallbacks(Choreographer.java:562)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.Choreographer.doFrame(Choreographer.java:532)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.os.Handler.handleCallback(Handler.java:725)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.os.Looper.loop(Looper.java:137)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at android.app.ActivityThread.main(ActivityThread.java:5039)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at java.lang.reflect.Method.invokeNative(Native Method)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at java.lang.reflect.Method.invoke(Method.java:511)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-12 15:00:45.909: E/AndroidRuntime(26467):    at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

6

TableRow.LayoutParamsの代わりに使用する必要がありTableLayout.LayoutParamsます。

于 2013-04-03T08:08:12.050 に答える