2011-03-01 76 views
15

我有两个相对的布局。两者都有填充父母的宽度和100下降的高度。我的要求是当我点击第一个布局时,它应该缩小到50dip高度,另一个扩展到150dip高度。在做这件事时我得到了异常。请帮助我如何在运行时更改布局宽度和高度。是否可以在运行时更改Android中的布局宽度和高度?

final LinearLayout RLChange = new LinearLayout(this);   
    RLChange.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
              LayoutParams.FILL_PARENT)); 
    RLChange.setOrientation(LinearLayout.VERTICAL); 

    final LinearLayout RLGreen = new LinearLayout(this);   
    RLGreen.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
              300)); 
    RLGreen.setBackgroundColor(Color.GREEN); 
    RLGreen.setOrientation(LinearLayout.HORIZONTAL); 

    Button btnClick = new Button(this);   
    btnClick.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 
    btnClick.setBackgroundColor(Color.RED); 

    RLGreen.addView(btnClick); 


    final LinearLayout RLYellow = new LinearLayout(this);   
    RLYellow.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
              200)); 
    RLYellow.setBackgroundColor(Color.YELLOW); 


    btnClick.setOnClickListener(new View.OnClickListener() {    
     public void onClick(View view) { 
        Toast.makeText(getApplicationContext(), "click", Toast.LENGTH_SHORT).show(); 
        RLGreen.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 
          LayoutParams.FILL_PARENT)); 
     } 
    }); 

    RLChange.addView(RLGreen); 
    RLChange.addView(RLYellow); 
    setContentView(RLChange); 




Log Cat 


03-10 11:01:35.328: INFO/NotificationService(574): enqueueToast pkg=Changewidth.com [email protected] duration=0 
03-10 11:01:35.388: DEBUG/AndroidRuntime(1505): Shutting down VM 
03-10 11:01:35.388: WARN/dalvikvm(1505): threadid=3: thread exiting with uncaught exception (group=0x4001aa28) 
03-10 11:01:35.398: ERROR/AndroidRuntime(1505): Uncaught handler: thread main exiting due to uncaught exception 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:326) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.view.View.measure(View.java:7703) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.view.View.measure(View.java:7703) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:464) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.view.View.measure(View.java:7703) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.view.View.measure(View.java:7703) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.view.ViewRoot.performTraversals(ViewRoot.java:747) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1613) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.os.Looper.loop(Looper.java:123) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at android.app.ActivityThread.main(ActivityThread.java:4203) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at java.lang.reflect.Method.invoke(Method.java:521) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
03-10 11:01:35.449: ERROR/AndroidRuntime(1505):  at dalvik.system.NativeStart.main(Native Method) 
03-10 11:01:35.479: INFO/Process(574): Sending signal. PID: 1505 SIG: 3 
03-10 11:01:35.479: INFO/dalvikvm(1505): threadid=7: reacting to signal 3 
03-10 11:01:35.619: INFO/dalvikvm(1505): Wrote stack trace to '/data/anr/traces.txt' 
03-10 11:01:35.779: DEBUG/dalvikvm(623): GC freed 3557 objects/196272 bytes in 448ms 

回答

24

在onClick Listener中添加此代码。

Button button = (Button) findViewById(view.getId()); 
LinearLayout rLGreen = ((LinearLayout) button.getParent()); 
rLGreen.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

它会工作。

+2

非常感谢你Saurabh为了消磨时间..它的工作:) – indira 2011-03-10 11:21:10

8

您好,您可以使用此代码更改布局的宽度和高度。

RelativeLayout.LayoutParams parms = new RelativeLayout.LayoutParams(width,height); 
RelativeLayout layout1 = (RelativeLayout) findViewById(R.id.layout1); 
lauout1.setLayoutParams(parms); 
+0

但是当我改变布局参数在运行时应用程序崩溃:( – indira 2011-03-04 04:01:11

+0

u能请提供您的代码块。 – 2011-03-07 11:10:15

+0

相同的代码为u上面提到的。但是,当我改变宽度在运行时,应用程序崩溃 – indira 2011-03-10 08:35:05

0

您是否在您的特定视图中使用了正确的LayoutParams类?尝试使用LinearLayout.LayoutParams。

0

请记住,LayoutParams由Parent(父视图组)使用,以确定如何布局此视图。

因此,举例来说,如果你有以下

LinearLayout 
    RelativeLayout1 
    RelativeLayout2 

你想改变RelativeLayout1或RelativeLayout2的宽度或高度, 那么你需要做这样的事情。

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, 200); 
//Get handle to RelativeLayout1 assuming it is R1, you would call 
R1.setLayoutParams(lp); 

你需要做同样的改变RelativeLayout2的LayoutParams。

是很容易忘记的层次结构,并假设你需要设置儿童的布局,但它是决定支持哪些属性的父(如对齐,或重力等)

希望这有助于。它已经烧了我几次......

2

这些参数提供给这个视图的父节点,指定它应该如何安排。 ViewGroup.LayoutParams有许多子类,它们对应于ViewGroup的不同子类,它们负责安排子女。因此,基本上,如果您要将视图添加到另一个视图,则必须将视图的LayoutParams设置为父级使用的LayoutParams类型,否则您将收到运行时错误。

相关问题