Android:我可以覆盖具有自己布局的第三方类(库)吗?

问题描述 投票:0回答:1

我在github上找到了一个非常不错的日历库,我想使用它。它有自己的布局。

https://github.com/prolificinteractive/material-calendarview

[某些UI功能我想更改,但我不想从头开始编写自己的日历。有没有办法可以覆盖此库?到目前为止,我尝试过产生错误。

我试图像这样扩展此类:

public class MyCustomCalendar extends MaterialCalendarView {

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

然后我将MyCustomCalendar类用作ConstraintLayout中的视图,如下所示:

<com.example.test.MyCustomCalendar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

并且我正在像这样在FragmentMainActivity中夸大此布局:

public class CalFragment  extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

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

}

但是,这会产生错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.test, PID: 19357
    android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating class com.example.test.MyCustomCalendar
    Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class com.example.test.MyCustomCalendar
    Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]

看来我无法像上面那样创建自己的XML布局,为什么呢?

java android inheritance android-library android-inflate
1个回答
0
投票

您的问题可能与图书馆无关。您需要为自定义视图实现以下构造函数:

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

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

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

当您在xml中使用视图时,系统将使用第二个或第三个构造函数,而不是第一个。

© www.soinside.com 2019 - 2024. All rights reserved.