проблемы с использованием setMeasuredDimension () - PullRequest
1 голос
/ 08 февраля 2012

Мне нужен мой собственный RadioButton со сложным индивидуальным дизайном (который не возможно только при использовании девяти патчей).

Итак, я подумал о расширении RadioButton и использовании всех функций из RadioGroup.

Для сложного индивидуального дизайна я раздуваю LinearLayout (сначала я использовал RelativeLayout, но, похоже, выдает исключение NullPointerException, поэтому я попробовал LinearLayout, который работает вместо).

Ну, у меня есть некоторые проблемы с измерением, компоновкой и отрисовкой 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.

Спасибо, что помогли мне с этим.

С наилучшими пожеланиями, Marco

1 Ответ

0 голосов
/ 09 февраля 2012

Ну, решение было довольно простым:)

@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)

Спасибо за любую помощь.

С уважением, Марко

...