Android 使用 LinearLayout.LayoutParams 时出现 ClassCastException

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11584900/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 08:09:24  来源:igfitidea点击:

ClassCastException when using LinearLayout.LayoutParams

androidandroid-layoutandroid-fragments

提问by tolgap

This is the exception:

这是例外:

07-20 19:52:14.193: E/AndroidRuntime(3908): FATAL EXCEPTION: main
07-20 19:52:14.193: E/AndroidRuntime(3908): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:634)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.View.measure(View.java:12892)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.View.measure(View.java:12892)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1249)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.View.measure(View.java:12892)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.View.measure(View.java:12892)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.View.measure(View.java:12892)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2265)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.View.measure(View.java:12892)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1240)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2628)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.os.Looper.loop(Looper.java:137)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at android.app.ActivityThread.main(ActivityThread.java:4507)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at java.lang.reflect.Method.invokeNative(Native Method)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at java.lang.reflect.Method.invoke(Method.java:511)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
07-20 19:52:14.193: E/AndroidRuntime(3908):     at dalvik.system.NativeStart.main(Native Method)

I can't see a line where the exception is thrown so I can't figure it out quite good. I do know it is in these lines:

我看不到抛出异常的行,所以我无法弄清楚。我知道它在这些行中:

public class TodayFragment extends Fragment {

ListView listView;
String[] urls;
ActionBar mActionBar;
Spinner spinner1;

public TodayFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    LinearLayout linear = new LinearLayout(getActivity());
    linear.setOrientation(LinearLayout.VERTICAL);

    spinner1 = new Spinner(getActivity());
    spinner1.setLayoutParams(new LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT));
    linear.addView(spinner1);
    listView = new ListView(getActivity());
    spinner1.setLayoutParams(new LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT));
    linear.addView(listView);

    new ParseHTML().execute();
    return linear;
    }
}

The fragment I'm using is android.support.v4.app.Fragment. What causes this?

我使用的片段是 android.support.v4.app.Fragment。这是什么原因造成的?

回答by ab11

Your import statement for LayoutParams is probably importing ViewGroup.LayoutParams. Try explicitly using LinearLayout.LayoutParams(...):

您的 LayoutParams 导入语句可能正在导入 ViewGroup.LayoutParams。尝试明确使用 LinearLayout.LayoutParams(...):

   spinner1.setLayoutParams(new LinearLayout.LayoutParams(
           LinearLayout.LayoutParams.WRAP_CONTENT,
           LinearLayout.LayoutParams.WRAP_CONTENT));

回答by I?igo

Try setting LinearLayout's LayoutParams' before attatching any children.

在附加任何孩子之前尝试设置 LinearLayout 的 LayoutParams'。

LinearLayout linear = new LinearLayout(getActivity());
linear.setLayoutParams(new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT));
linear.setOrientation(LinearLayout.VERTICAL);

回答by Maxime Ancelin

In case you're wondering which LayoutParams you must use for each View, look at this doc:

如果您想知道每个视图必须使用哪些 LayoutParams,请查看此文档

Each view must have a LayoutParam acording to his parent.

每个视图必须有一个 LayoutParam 根据其父视图。

For example, in order to create this Views hierarhy,

例如,为了创建此视图层次结构,

  • RelativeLayout relativeLayout
    • LinearLayout linearLayout , orientation: vertical
    • TextView textView
    • Button button1
    • Button button2
  • 相对布局相对布局
    • LinearLayout linearLayout ,方向:垂直
    • 文本视图文本视图
    • 按钮按钮 1
    • 按钮按钮 2

replace the content of your onCreate method in your main activity with :

将主要活动中的 onCreate 方法的内容替换为:

  super.onCreate(savedInstanceState);
  RelativeLayout relativeLayout = new RelativeLayout(this);

  LinearLayout linearLayout = new LinearLayout(this);
  linearLayout.setOrientation(LinearLayout.VERTICAL);
  linearLayout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
  relativeLayout.addView(linearLayout);

  TextView textView = new TextView(this);
  textView.setText("a text");
  textView.setLayoutParams(new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
  linearLayout.addView(textView);

  Button button1 = new Button(this);
  button1.setText("button 1");
  button1.setLayoutParams(new LinearLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
  linearLayout.addView(button1);

  setContentView(relativeLayout);