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

Posted

技术标签:

【中文标题】Android:我可以覆盖具有自己布局的第三方类(库)吗?【英文标题】:Android: Can I override a third party class (library) that has its own layout? 【发布时间】:2020-03-23 00:28:45 【问题描述】:

我在 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_
        android:layout_
        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 布局,为什么会这样?

【问题讨论】:

嗯,你可以在本地克隆这个库并更改它? 您错过了文档的这一部分吗? github.com/prolificinteractive/… 文档的哪一部分? 【参考方案1】:

您的问题可能与库无关。您需要为自定义视图实现这些构造函数:

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中使用视图时,系统会使用第二个或第三个构造函数,而不是第一个。

【讨论】:

这确实解决了你是对的错误。它会使用哪一个?或者我在构造函数中编写的任何逻辑都应该包含在所有这些中? 在这种情况下,拥有第二个构造函数就足够了。你可以在这里阅读更多:developer.android.com/reference/android/view/…

以上是关于Android:我可以覆盖具有自己布局的第三方类(库)吗?的主要内容,如果未能解决你的问题,请参考以下文章

android 1080p屏幕 有无虚拟按键的适配

如何设置drawer layout覆盖状态栏之上 android

在 Android 中使用具有多个布局的单个片段

是否可以有一个带有顶部文本的背景图像的按钮?

具有特定形状的 Android 自定义视图

Android - 劫持点击[关闭]