安卓自定义复合组件的内容不会显示出来。

3
我正在尝试创建一个自定义视图,即日历。该组件中的视图是从xml布局膨胀而来的。我学习了几个教程以及在stackoverflow上找到的三四个类似(甚至相同)的问题,但似乎没有任何作用。如果您能指出问题,我将不胜感激。先感谢您,并附上代码。
kcalendar_view.xml //自定义视图的布局
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center" >

        <Button
            android:id="@+id/btnKCalendarNavLeft"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_margin="5dp"
            android:background="@drawable/kcalendar_nav_button_bg"
            android:text="&lt;" />

        <TextView
            android:id="@+id/txvKCalendarNavTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="-"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <Button
            android:id="@+id/btnKCalendarNavRight"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_margin="5dp"
            android:background="@drawable/kcalendar_nav_button_bg"
            android:text=">" />

    </LinearLayout>

    <GridView
        android:id="@+id/gridViewKCalendar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:numColumns="7" >
    </GridView>

</merge>

KCalendarView.java // 自定义视图的类

package ir.kcoder.KCalendarView;

import ir.kcoder.persiancalendarweather.R;

import java.util.Calendar;

import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.GridView;
import android.widget.LinearLayout;

import com.samanpr.jalalicalendar.JalaliCalendar;
import com.samanpr.jalalicalendar.JalaliCalendar.YearMonthDate;


public class KCalendarView extends LinearLayout {
    private YearMonthDate currentJalaliDate;
    private int parentWidth, parentHeight;
    private Button leftButton, rightButton;
    private GridView gridView;
    private KCalendarAdapter calendarAdapter;
    private Context context;
    private View inflated;

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

    public KCalendarView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        setOrientation(LinearLayout.VERTICAL);
        setGravity(Gravity.CENTER);
        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflated = inflater.inflate(R.layout.kcalendar_view, this, true);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        init(getContext());
    }

    private void init(Context context) {
        Calendar c = Calendar.getInstance();
        YearMonthDate currentGregDate = new YearMonthDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE));
        currentJalaliDate = JalaliCalendar.gregorianToJalali(currentGregDate);

        leftButton = (Button)findViewById(R.id.btnKCalendarNavLeft);
        rightButton = (Button)findViewById(R.id.btnKCalendarNavRight);
        gridView = (GridView)findViewById(R.id.gridViewKCalendar);

        if(gridView != null) {
            calendarAdapter = new KCalendarAdapter(context, currentJalaliDate.getYear(),
                    currentJalaliDate.getMonth());
            gridView.setAdapter(calendarAdapter);
        }
    }

    public void nextMonth() {

    }

    public void prevMonth() {

    }

//  @Override
//  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//      parentWidth = MeasureSpec.getSize(widthMeasureSpec);
//      parentHeight = MeasureSpec.getSize(heightMeasureSpec);
//      this.setMeasuredDimension(parentWidth, parentHeight);
//      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//  }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        // TODO Auto-generated method stub
    }
}

activity_main.xml // 我使用这个标签在我的应用程序中包含自定义视图

<ir.kcoder.KCalendarView.KCalendarView
        android:id="@+id/kCalendarView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" >

    </ir.kcoder.KCalendarView.KCalendarView>
1个回答

1
更新
尝试这个,我认为它应该可以工作。
public class KCalendarView extends LinearLayout {

    private YearMonthDate currentJalaliDate;

    private int parentWidth, parentHeight;

    private Button leftButton, rightButton;
    private GridView gridView;

    private KCalendarAdapter calendarAdapter;

    public KCalendarView(Context context, AttributeSet attrs) {
        super(context, attrs);

        doInflate();
    }

    private void doInflate() {
        setOrientation(LinearLayout.VERTICAL);
        setGravity(Gravity.CENTER);
        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

        inflate(getContext(), R.layout.kcalendar_view, this);

        leftButton = (Button)findViewById(R.id.btnKCalendarNavLeft);
        rightButton = (Button)findViewById(R.id.btnKCalendarNavRight);
        gridView = (GridView)findViewById(R.id.gridViewKCalendar);

        init();
    }

    private void init() {
        Calendar c = Calendar.getInstance();
        YearMonthDate currentGregDate = new YearMonthDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE));
        currentJalaliDate = JalaliCalendar.gregorianToJalali(currentGregDate);
        calendarAdapter = new KCalendarAdapter(context, currentJalaliDate.getYear(), currentJalaliDate.getMonth());
        gridView.setAdapter(calendarAdapter);
    }

    public void nextMonth() {

    }

    public void prevMonth() {

    }
}

谢谢Gary,但不幸的是那也没起作用。 - Milad.Nozari
一个词:太棒了。非常感谢,我整天都在苦苦挣扎这个问题。主要问题出在onLayout方法上。 - Milad.Nozari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接