Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在调用onMeasure时,Android自定义视图的宽度始终为0_Java_Android_Android Custom View - Fatal编程技术网

Java 在调用onMeasure时,Android自定义视图的宽度始终为0

Java 在调用onMeasure时,Android自定义视图的宽度始终为0,java,android,android-custom-view,Java,Android,Android Custom View,我对安卓开发相当陌生,正在努力学习诀窍。为了做到这一点,我一直在安卓系统中胡乱处理自定义视图。我正在尝试建立一个闹钟应用程序,我想做一个很好的微调器来选择时间。类似于这样说: 我创建了一个AndroidCollSpinner类,如下所示: public class AndroidScrollSpinner extends View { public AndroidScrollSpinner(Context context) { super(context);

我对安卓开发相当陌生,正在努力学习诀窍。为了做到这一点,我一直在安卓系统中胡乱处理自定义视图。我正在尝试建立一个闹钟应用程序,我想做一个很好的微调器来选择时间。类似于这样说:

我创建了一个AndroidCollSpinner类,如下所示:

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);
    }
}
我遇到的问题是在线测量

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>

如果您需要了解有关该应用程序的其他信息,请查看下面的

我也意识到可能有第三方库,我可以使用它们来获得我想要的微调器效果。然而,我确实是在做一个学习练习,所以对我来说,理解为什么这段代码总是返回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;
    }
}
public类AddAlarmFragment扩展了片段{
私有AndroidClickSpinner分钟Spinner;
私有AndroidClickSpinner小时微调器;
私有AndroidClickSpinner-amPmSpinner;
私人切换按钮周一切换;
私人切换按钮星期二切换;
私人切换按钮星期三切换;
私人切换按钮周四切换;
私人切换按钮星期五切换;
私有切换按钮saturdayToggle;
私人切换按钮sundayToggle;
专用交换机hour24Switch=null;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
返回充气机。充气(R.layout.add_报警,容器,错误);
}
已创建视图上的公共void(视图,捆绑保存状态){
super.onViewCreated(视图,savedInstanceState);
创建微调器(视图);
}
@凌驾
恢复时公开作废(){
super.onResume();
}
公共void创建微调器(视图){
LinearLayout=(LinearLayout)view.findViewById(R.id.addAlarmSpinnerLayout);
hour24Switch=(Switch)view.findViewById(R.id.hour24Switch);
layout.removeallview();
ArrayList小时数=新建ArrayList();
if(hour24Switch.isChecked()){

对于(inti=0;i我很抱歉,但是在您的布局中,您在哪里使用它?
您是从代码中添加它的吗?因为我看不到它包含在XML布局文件中的某个地方

我是通过编程方式添加它的。它位于createSpinners方法的AddAlarmFragment类中。您知道您在每次绘图调用中都会一次又一次地创建所有绘图资源吗?是的,这已经得到了修复,但我更想知道为什么是在何时以编程方式创建对象MeasureSpec调用返回0