2013-11-01 96 views
0

我有一个活动,它包含5个片段。在其中一个片段中有ButtonRelativeLayout。我想让我的按钮能够改变这个RelativeLayout的高度或宽度。使用按钮的onClick方法更改片段中的布局参数

我的xml:

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" > 

    <LinearLayout 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="@android:color/white" 
android:orientation="vertical" > 

<Button 
    android:id="@+id/sSumBut" 
    android:layout_width="250dp" 
    android:layout_height="40dp" 
    android:layout_gravity="center_horizontal" 
    android:layout_marginTop="10dp" 
    android:onClick="onClick" > 
</Button> 

<RelativeLayout 
    android:id="@+id/sSum" 
    android:layout_width="250dp" 
    android:layout_height="0dp" 
    android:layout_gravity="center_horizontal" 
    android:background="@android:color/black" > 

</RelativeLayout> 


     </LinearLayout> 

     </ScrollView> 

正如你所看到的RelativeLayout的高度为0。我希望按钮可以将它更改为100dp。

这是我Fragment类:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
    View myFragmentView = inflater.inflate(R.layout.up, container, false); 

    Button sButton = (Button) myFragmentView.findViewById(R.id.sSumBut); 
    final RelativeLayout sSummary = (RelativeLayout) myFragmentView.findViewById(R.id.sSum); 

    sButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // When button is clicked. 
      sSummary.setLayoutParams(new RelativeLayout.LayoutParams(250, 250)); 
     } 
    }); 

但是这给了错误Cannot refer to a non-final variable,如果我把这些变量最后,我通常不能动态地改变它的onClick方法内。请考虑这个课程是Fragment,我该如何解决这个问题?

错误日志:

 11-01 15:07:03.035: E/AndroidRuntime(3048): FATAL EXCEPTION: main 
     11-01 15:07:03.035: E/AndroidRuntime(3048): java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.LinearLayout.measureVertical(LinearLayout.java:360) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.View.measure(View.java:8366) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1284) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.ScrollView.onMeasure(ScrollView.java:354) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.View.measure(View.java:8366) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.View.measure(View.java:8366) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1451) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.View.measure(View.java:8366) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.View.measure(View.java:8366) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.LinearLayout.measureVertical(LinearLayout.java:531) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.View.measure(View.java:8366) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.View.measure(View.java:8366) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.View.measure(View.java:8366) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.ViewRoot.performTraversals(ViewRoot.java:847) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.view.ViewRoot.handleMessage(ViewRoot.java:1868) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.os.Handler.dispatchMessage(Handler.java:99) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.os.Looper.loop(Looper.java:130) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at android.app.ActivityThread.main(ActivityThread.java:3693) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at java.lang.reflect.Method.invokeNative(Native Method) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at java.lang.reflect.Method.invoke(Method.java:507) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
     11-01 15:07:03.035: E/AndroidRuntime(3048): at dalvik.system.NativeStart.main(Native Method) 
+0

如果您进行Sum最终,您仍然可以访问它自己及其方法/孩子。你只是不能改变对象本身,例如这是行不通的:final Object x = null; x = new Object();因为它的“最终”声明为空。但最终的CustomObject y = new CustomObject(); y.changeProperties(); y.doSomething();仍然有效。 – damian

+0

@damian我做了你说的,但它又崩溃了,我发布了错误日志,请你检查一下吗? –

+0

你可以显示你的XML布局吗? – damian

回答

1
sSummary.setLayoutParams(new RelativeLayout.LayoutParams(250, 250)); 

sSummary,哪怕是一个RelativeLayout,是LinearLayout内。视图的布局参数指的是父级布局,因此这里布局参数的正确类型将是LinearLayout.LayoutParams。这是导致类抛出异常的原因。

通常一个好方法是修改现有布局参数,如getLayoutParams()所检索的那样。在就地修改返回的参数后,请求使用requestLayout()setLayoutParams()也隐含地这样做)重新布局。

+0

这是你第二次“真正”解决我的问题:D非常感谢! –

0

为什么你得到一个错误的原因是因为你不能被类外实例化没有它最终的OnClickListener内引用变量。

事实上,这是一个Fragment不应该改变任何东西,这只是一个正确的问题。您可以简单地进行以下更新:

final RelativeLayout Sum = (RelativeLayout) myFragmentView.findViewById(R.id.Sum); 

而且这应该可以解决您收到的错误。

+0

我做了你所说的但又崩溃了,我发布了错误日志,请你检查一下吗? –

0

好的,原因是因为某些原因,问题是LinearLayout。我将其更改为RelativeLayout,我的问题已修复。这到底是什么LinearLayout?我信了你。