【问题标题】:problems using setMeasuredDimension()使用 setMeasuredDimension() 的问题
【发布时间】:2012-02-08 11:27:36
【问题描述】:

我需要我自己的具有复杂定制设计的 RadioButton(不是 只能使用九个补丁)。

所以我决定扩展 RadioButton 并使用来自 电台组。

对于复杂的自定义设计,我膨胀了一个 LinearLayout(起初我 使用了RelativeLayout,但它似乎抛出了NullPointerException,所以我 尝试了 LinearLayout 来代替)。

嗯,我在测量、布局和绘制 线性布局。

假设有这种复杂的自定义设计:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="100dip" android:layout_height="wrap_content" android:orientation="vertical" android:layout_weight="1"... >

    <TextView android:id="@+id/tab_count" android:layout_width="wrap_content" android:layout_height="wrap_content"... />

    <TextView android:id="@+id/tab_text" android:layout_width="wrap_content" android:layout_height="wrap_content"... />

</LinearLayout>

这是“新”观点:

public class RadioView extends RadioButton {

    private LinearLayout container;
    private TextView count, text;

    public RadioView(Context context) {
       super(context);
       init(context);
    }

    public RadioView(Context context, AttributeSet attrs) {
       super(context, attrs);
       init(context);
    }

    public RadioView(Context context, AttributeSet attrs, int defStyle) {
       super(context, attrs, defStyle);
       init(context);
    }

    private void init(final Context context) {
       LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       container = (LinearLayout) inflater.inflate(R.layout.ve_radio, null);
       count = (TextView) container.findViewById(R.id.tab_count);
       text = (TextView) container.findViewById(R.id.tab_text);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       container.measure(widthMeasureSpec, heightMeasureSpec);

       // here comes the problem
       setMeasuredDimension(200, 200);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
       container.layout(left, top, right, bottom);
    }

    @Override
    protected void onDraw(Canvas canvas) {
       container.draw(canvas);
    }

}

其实我不知道如何计算测量尺寸。成为 老实说,我希望 RadioGroup 为我和我计算足够的空间 想将此空间委托给膨胀的 LinearLayout。

感谢您在这方面帮助我。

最好的问候, 马可

【问题讨论】:

    标签: android view radio-button inflate


    【解决方案1】:

    嗯,解决方案很简单:)

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        container.measure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(container.getMeasuredWidth(), container.getMeasuredHeight());
    }
    

    现在我想谈谈 RelatriveLayout NullPointerException。

    我将 LinearLayout 更改为 RelativeLayout,这就是我得到的:

    FATAL EXCEPTION: main
    java.lang.NullPointerException
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:472)
    at android.view.View.measure(View.java:12603)
    at nu.style.RadioView.onMeasure(RadioView.java:84)
    at android.view.View.measure(View.java:12603)
    at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1196)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:555)
    at android.view.View.measure(View.java:12603)
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594)
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376)
    at android.view.View.measure(View.java:12603)
    at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1163)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
    at android.widget.ScrollView.onMeasure(ScrollView.java:312)
    at android.view.View.measure(View.java:12603)
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594)
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376)
    at android.view.View.measure(View.java:12603)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
    at android.view.View.measure(View.java:12603)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
    at android.view.View.measure(View.java:12603)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2072)
    at android.view.View.measure(View.java:12603)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1044)
    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4340)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)
    

    感谢您的帮助。

    最好的问候, 马可

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 2013-07-24
      相关资源
      最近更新 更多