2011-03-01 28 views
15

Tengo dos diseños relativos. Ambos tienen ancho de relleno padre y altura de 100 inmersión. Mi requerimiento es que cuando haga clic en el primer diseño, se reduzca a 50dip de altura y el otro se expanda a la altura de 150dip. Mientras hago esto tengo una excepción. Por favor, ayúdame a cambiar el ancho y la altura del diseño en tiempo de ejecución.¿Es posible cambiar el ancho y la altura del diseño en Android en tiempo de ejecución?

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 

Respuesta

24

En OnClick Listener agregue este código.

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

Funcionará.

+2

Muchas gracias Saurabh por gastar tu tiempo ... funciona :) – indira

8

Hola, puedes cambiar el ancho y alto de tu diseño con este código.

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

pero cuando cambio los parámetros de propiedades en tiempo de ejecución se bloquea la aplicación :( – indira

+0

puede u por favor proporcione su trozo de código. –

+0

mismo código que u mencionado anteriormente. Pero cuando cambio el ancho en tiempo de ejecución, la aplicación se bloquea – indira

0

¿Está utilizando la clase LayoutParams correcta para su vista en particular? Intenta usar LinearLayout.LayoutParams.

0

Recuerde que LayoutParams es utilizado por el elemento principal (grupo de vista de elemento primario) para determinar cómo se distribuye esta vista.

Así, por ejemplo, si tiene los siguientes

LinearLayout 
    RelativeLayout1 
    RelativeLayout2 

y desea cambiar la anchura o la altura de la RelativeLayout1 o RelativeLayout2, entonces usted tiene que hacer algo como esto.

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

Debería hacer lo mismo para cambiar LayoutParams de RelativeLayout2 también.

que es, es fácil olvidar la jerarquía, y asumir que es necesario configurar la disposición del niño, pero es la matriz que determina qué atributos son compatibles (por ejemplo. La alineación o la gravedad, etc ..)

Espero que esto ayude. Me ha quemado un par de veces ...

2

Estos parámetros de suministro al padre de esta vista especifican cómo se debe organizar. Hay muchas subclases de ViewGroup.LayoutParams y corresponden a las diferentes subclases de ViewGroup que se encargan de organizar sus hijos.

Básicamente, si está agregando una vista a otra, DEBE configurar el LayoutParams de la vista al tipo LayoutParams que usa el padre o recibirá un error de tiempo de ejecución.

Cuestiones relacionadas