【问题标题】:Unable to create Views using Gridlayout programmatically无法以编程方式使用 Gridlayout 创建视图
【发布时间】:2014-03-12 14:03:53
【问题描述】:

我正在 android 中创建一个类似于以下内容的图片库:

我使用Gridlayout 作为主要布局,Linearlayouts 用于项目。我就是这样做的:

//this is a method that returns a polaroid tile that I add in gridlayout
public LinearLayout ConstructAlbumGridLinearLayout(final int id) {

        LinearLayout albumLayout = new LinearLayout(
                context.getApplicationContext());
        RelativeLayout albumDetailsLayout = new RelativeLayout(
                context.getApplicationContext());
        TextView albumName = new TextView(context.getApplicationContext());
        TextView albumPicturesNumber = new TextView(
                context.getApplicationContext());
        LinearLayout pictureHolder = new LinearLayout(
                context.getApplicationContext());

        LinearLayout pictureRowOneHolder = new LinearLayout(
                context.getApplicationContext());
        LinearLayout pictureRowTwoHolder = new LinearLayout(
                context.getApplicationContext());

//this is the line, which throws an exception, even if I do wrap_content
//      albumLayout.setLayoutParams(new LayoutParams(100,
//              100));

        pictureRowOneHolder.setOrientation(LinearLayout.HORIZONTAL);
        pictureRowOneHolder.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        pictureRowTwoHolder.setOrientation(LinearLayout.HORIZONTAL);
        pictureRowTwoHolder.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        pictureHolder.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        pictureHolder.setOrientation(LinearLayout.VERTICAL);

        albumLayout.setOrientation(LinearLayout.VERTICAL);

        albumDetailsLayout.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        RelativeLayout.LayoutParams rlName = new RelativeLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        rlName.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        albumName.setLayoutParams(rlName);
        albumName.setText("Family");

        RelativeLayout.LayoutParams rlSize = new RelativeLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        rlSize.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        albumPicturesNumber.setLayoutParams(rlSize);
        albumPicturesNumber.setText("3");

        for (int j = 0; j < 2; ++j) {
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                    30, 30);
            ImageView albumPic = new ImageView(context.getApplicationContext());
            albumPic.setImageResource(R.drawable.movie1);
            albumPic.setLayoutParams(layoutParams);
            pictureRowOneHolder.addView(albumPic);
        }

        for (int j = 0; j < 2; ++j) {
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                    30, 30);
            ImageView albumPic = new ImageView(context.getApplicationContext());
            albumPic.setImageResource(R.drawable.movie1);
            albumPic.setLayoutParams(layoutParams);
            pictureRowTwoHolder.addView(albumPic);
        }

        pictureHolder.addView(pictureRowOneHolder);
        pictureHolder.addView(pictureRowTwoHolder);

        albumDetailsLayout.addView(albumName);
        albumDetailsLayout.addView(albumPicturesNumber);

        albumLayout.addView(albumDetailsLayout);
        albumLayout.addView(pictureHolder);

        return albumLayout;

    }

然后我在我的网格布局中添加这个布局:

gl.addView(pictureGallery.ConstructAlbumGridLinearLayout(i));

这是我的XML file

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:id="@+id/albumLinearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/pictureType"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="My Albums"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <GridLayout 
        android:id="@+id/albumMainGrid"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

我不确定我在这里做错了什么......是网格布局本身吗?还是带有网格布局的线性布局被证明是一个问题?

编辑 - 这是一个例外:

02-13 20:11:28.250: E/AndroidRuntime(5040): FATAL EXCEPTION: main
02-13 20:11:28.250: E/AndroidRuntime(5040): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.GridLayout$LayoutParams
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.GridLayout.getLayoutParams1(GridLayout.java:729)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.GridLayout.validateLayoutParams(GridLayout.java:663)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.GridLayout.getLayoutParams(GridLayout.java:734)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.GridLayout.measureChildrenWithMargins(GridLayout.java:866)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.GridLayout.onMeasure(GridLayout.java:894)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.View.measure(View.java:12775)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4709)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1385)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:670)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.View.measure(View.java:12775)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4709)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.View.measure(View.java:12775)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:822)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:563)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.View.measure(View.java:12775)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4709)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2240)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.View.measure(View.java:12775)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1151)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2539)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.os.Looper.loop(Looper.java:137)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at android.app.ActivityThread.main(ActivityThread.java:4514)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at java.lang.reflect.Method.invokeNative(Native Method)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at java.lang.reflect.Method.invoke(Method.java:511)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
02-13 20:11:28.250: E/AndroidRuntime(5040):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 您有任何错误示例吗?日志猫?堆栈痕迹?观察?
  • @biddulph.r 我已经添加了错误描述
  • 在您的代码中,我看到了一个问题,我认为这可能是导致您的异常的原因:您在专辑布局上应用了 LayoutParams 而不是 GridLayout.LayoutParams。
  • @LaurentMeyer albumLayout 是一个LinearLayout .. 我怎样才能在上面设置GridLayout.LayoutParams
  • 所以,我是对的,不是吗?与@biddulph.r 的答案相同,但在评论中:(祝你的项目结束好运:)

标签: android android-layout android-linearlayout android-gridlayout


【解决方案1】:

从您的 Logcat 看来,您正在将 ViewGroup.LayoutParams 类转换为 GridLayout.LayoutParams。这是您调用 LayoutParams 的构造方法时的常见问题:

albumLayout.setLayoutParams(new LayoutParams(100, 100));

您想具体说明您的LayoutParams,因此,如果您使用的是GridLayout,请使用GridLayout.LayoutParams,而对于LinearLayout,请使用LinearLayout.LayoutParams 等。这样可以像往常一样阻止错误的版本被拾取想要使用您的 ViewGroup 的父类。

在上面的例子中,albumLayout 是一个GridLayout,所以你想使用GridLayout.LayoutParams。将该行更改为:

albumLayout.setLayoutParams(new GridLayout.LayoutParams(100, 100));

您还有几个实例,其中有 LinearLayoutsRelativeLayout 可以进行相同的更改。 (LinearLayout.LayoutParamsRelativeLayout.LayoutParams)。

【讨论】:

  • albumLayout 本身就是一个LinearLayout,我试过:albumLayout.setLayoutParams(new LinearLayout.LayoutParams(100, 100));.. 同样的例外..
  • 让它工作..您将LayoutParams设置为其ViewGroup的父类是正确的..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 2019-10-10
  • 2017-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多