簡體   English   中英

調用onMeasure時,Android自定義視圖的寬度始終為0

[英]Android Custom View always getting 0 width when calling onMeasure

我對android開發人員還很陌生,正在嘗試學習繩索。 為了做到這一點,我一直在搞亂android中的“自定義視圖”。 我正在嘗試構建一個鬧鍾應用程序,我想制作一個不錯的微調器以選擇時間。 類似於這樣說:

http://i47.tinypic.com/aymyjc.jpg

我創建了一個如下所示的AndroidScollSpinner類:

public class AndroidScrollSpinner extends View {


    public AndroidScrollSpinner(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawBackground(canvas);
        drawSomeText(canvas);
        canvas.restore();

    }

    private void drawSomeText(Canvas canvas) {
        Paint titlePaint = new Paint();
        titlePaint.setColor(Color.BLUE);
        canvas.drawTextOnPath("Bert", new Path(), 0.0f,0.0f, titlePaint);
    }

    private void drawBackground(Canvas canvas) {
        Paint backgroundPaint = new Paint();
        backgroundPaint.setColor(getResources().getColor(R.color.bluegrass));
        backgroundPaint.setStyle(Paint.Style.FILL);
        Bitmap background = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
        canvas.drawBitmap(background, 0, 0, backgroundPaint);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int minw = getPaddingLeft() + getPaddingRight() + getSuggestedMinimumWidth();
        int w = Math.max(minw, MeasureSpec.getSize(widthMeasureSpec));
        int h = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(w, h);
    }
}

我遇到的問題是onMeasure

MeasureSpec.getSize(widthMeasureSpec)始終返回0。有人知道為什么嗎? 還是我在這里想念的東西?

這也是我的布局文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content">
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="horizontal"
                  android:layout_width="fill_parent"
                  android:layout_height="match_parent"
                  android:gravity="center_horizontal"
                  android:id="@+id/addAlarmSpinnerLayout">
    </LinearLayout>
    <LinearLayout android:layout_width="match_parent"
                  android:layout_height="wrap_content">

        <ToggleButton android:id="@+id/sundayToggleButton"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_weight="0.14"
                      android:textOn="@string/S"
                      android:textOff="@string/S"/>
        <ToggleButton android:id="@+id/mondayToggleButton"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_weight="0.14"
                      android:textOn="@string/M"
                      android:textOff="@string/M"/>
        <ToggleButton android:id="@+id/tuesdayToggleButton"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_weight="0.14"
                      android:textOn="@string/T"
                      android:textOff="@string/T"/>
        <ToggleButton android:id="@+id/wednesdayToggleButton"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_weight="0.14"
                      android:textOn="@string/W"
                      android:textOff="@string/W"/>
        <ToggleButton android:id="@+id/thursdayToggleButton"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_weight="0.14"
                      android:textOn="@string/T"
                      android:textOff="@string/T"/>
        <ToggleButton android:id="@+id/fridayToggleButton"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_weight="0.14"
                      android:textOn="@string/F"
                      android:textOff="@string/F"/>
        <ToggleButton android:id="@+id/saturdayToggleButton"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_weight="0.14"
                      android:textOn="@string/S"
                      android:textOff="@string/S"/>
    </LinearLayout>
    <Button android:id="@+id/doneButton"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/done"
            android:onClick="onDoneClicked">
    </Button>
    <Switch
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hour24Clock"
            android:id="@+id/hour24switch"
            android:layout_gravity="center"
            android:enabled="true"
            android:onClick="createSpinners"/>

</LinearLayout>

如果您需要了解有關該應用的其他信息,請在https://github.com/rdsmallwood928/NeverLate下查看

我也意識到那里可能存在第三方庫,可以用來獲得所需的微調效果。 但是,我實際上是在進行學習,因此對我來說,理解為什么這段代碼總是返回0而不是從其他地方注入自定義組件並繼續我的生活,對我來說更為重要。 在此先感謝您的幫助!

編輯:這是創建微調器的AddAlarmFragment類

public class AddAlarmFragment extends Fragment {

    private AndroidClickSpinner minuteSpinner;
    private AndroidClickSpinner hourSpinner;
    private AndroidClickSpinner amPmSpinner;
    private ToggleButton mondayToggle;
    private ToggleButton tuesdayToggle;
    private ToggleButton wednesdayToggle;
    private ToggleButton thursdayToggle;
    private ToggleButton fridayToggle;
    private ToggleButton saturdayToggle;
    private ToggleButton sundayToggle;
    private Switch hour24Switch = null;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.add_alarm, container, false);
    }

    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        createSpinners(view);
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    public void createSpinners(View view) {
        LinearLayout layout = (LinearLayout) view.findViewById(R.id.addAlarmSpinnerLayout);
        hour24Switch = (Switch) view.findViewById(R.id.hour24switch);
        layout.removeAllViews();
        ArrayList<Object> hours = new ArrayList<>();
        if(hour24Switch.isChecked())  {
            for(int i=0;i<24;i++) hours.add(i);
        } else {
            for(int i=1;i<=12;i++) hours.add(i);
        }

        hourSpinner = new AndroidClickSpinner(getActivity(), hours);
        layout.addView(hourSpinner);
        ArrayList<Object> minutes = new ArrayList<>();
        for(int i=0;i<=60;i++) minutes.add(i);
        minuteSpinner = new AndroidClickSpinner(getActivity(), minutes);
        layout.addView(minuteSpinner);
        if(!hour24Switch.isChecked()) {
            ArrayList<Object> amPm = new ArrayList<>();
            amPm.add("AM");
            amPm.add("PM");
            amPmSpinner = new AndroidClickSpinner(getActivity(), amPm);
            layout.addView(amPmSpinner);
        }
        mondayToggle = (ToggleButton) view.findViewById(R.id.mondayToggleButton);
        tuesdayToggle = (ToggleButton) view.findViewById(R.id.tuesdayToggleButton);
        wednesdayToggle = (ToggleButton) view.findViewById(R.id.wednesdayToggleButton);
        thursdayToggle = (ToggleButton) view.findViewById(R.id.thursdayToggleButton);
        fridayToggle = (ToggleButton) view.findViewById(R.id.fridayToggleButton);
        saturdayToggle = (ToggleButton) view.findViewById(R.id.saturdayToggleButton);
        sundayToggle = (ToggleButton) view.findViewById(R.id.sundayToggleButton);
        //Prevent no day selected...
        switch (new LocalDate().getDayOfWeek()) {
            case 1:
                mondayToggle.setSelected(true);
                break;
            case 2:
                tuesdayToggle.setSelected(true);
                break;
            case 3:
                wednesdayToggle.setSelected(true);
                break;
            case 4:
                thursdayToggle.setSelected(true);
                break;
            case 5:
                fridayToggle.setSelected(true);
                break;
            case 6:
                saturdayToggle.setSelected(true);
                break;
            case 7:
                sundayToggle.setSelected(true);
                break;
        }
        PieChart pie = new PieChart(getActivity());
        Resources res = getResources();
        pie.addItem("Agamemnon", 2, res.getColor(R.color.seafoam));
        pie.addItem("Bocephus", 3.5f, res.getColor(R.color.chartreuse));
        pie.addItem("Calliope", 2.5f, res.getColor(R.color.emerald));
        pie.addItem("Daedalus", 3, res.getColor(R.color.bluegrass));
        pie.addItem("Euripides", 1, res.getColor(R.color.turquoise));
        pie.addItem("Ganymede", 3, res.getColor(R.color.slate));
        layout.addView(pie);
        layout.addView(new AndroidScrollSpinner(getActivity()));
    }

    public Integer getHours() {
        Integer hour = Integer.parseInt(hourSpinner.getSelectedItem().toString());
        if(!hour24Switch.isChecked()) {
            if(hour == 12) {
                hour = 0;
            }
            if(amPmSpinner.getSelectedItem().equals("PM")) {
                hour = hour + 12;
            }
        }
        return hour;
    }

    public Integer getMinutes() {
        return Integer.parseInt(minuteSpinner.getSelectedItem().toString());
    }

    public boolean[] getDays() {
        boolean[] days = new boolean[7];
        days[0] = mondayToggle.isChecked();
        days[1] = tuesdayToggle.isChecked();
        days[2] = wednesdayToggle.isChecked();
        days[3] = thursdayToggle.isChecked();
        days[4] = fridayToggle.isChecked();
        days[5] = saturdayToggle.isChecked();
        days[6] = sundayToggle.isChecked();
        return days;
    }
}

抱歉,您在布局中的什么位置使用它? 您是否要從代碼中添加它,因為我看不到它包含在XML布局文件中的某處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM