【问题标题】:Casting custom view on inflated View在膨胀视图上投射自定义视图
【发布时间】:2017-01-11 11:47:05
【问题描述】:

我有这样的布局

pie_chart.xml

<?xml version="1.0" encoding="utf-8"?>
<com.github.mikephil.charting.charts.PieChart
    android:layout_width="match_parent"
    android:id="@+id/piechart"
    android:layout_height="200dp"
    android:background="#F00"
    xmlns:android="http://schemas.android.com/apk/res/android" />

我正在尝试将 PieChart 类型转换为我膨胀的视图。我正在将 MPAndroidchart 用于图表。 PieChart 的父类扩展了 VieGroup,所以我认为将 PieChart 类型投射到 View 上应该是正确的,但这给了我一个错误。

导致问题的代码:

   @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_overview, container, false);

    View pieView =  View.inflate(AppContext.context, R.layout.pie_chart,(ViewGroup)view);
    PieChart pieChart= (PieChart) pieView;

    return view;
}

LogCat:

java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to com.github.mikephil.charting.charts.PieChart
                                                                   at com.teltonika.rms.fragment.OverviewFragment.onCreateView(OverviewFragment.java:31)
                                                                   at android.support.v4.app.Fragment.performCreateView(Fragment.java:2184)
                                                                   at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298)
                                                                   at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323)
                                                                   at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136)
                                                                   at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092)
                                                                   at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1998)
                                                                   at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:709)
                                                                   at android.os.Handler.handleCallback(Handler.java:739)
                                                                   at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                   at android.os.Looper.loop(Looper.java:158)
                                                                   at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

【问题讨论】:

  • 给我看看这个 PieChart 类你扩展了什么?
  • @sushantgosavi 我不能来自 MPAndroidCharts 库
  • 请解释你为什么不赞成我的问题。它是按规则构建的,我认为是相当合理的
  • @VygintasB 等等。我不知道为什么用户这样做

标签: android view casting


【解决方案1】:

你得到了

java.lang.ClassCastException: android.widget.LinearLayout 不能 转换为 com.github.mikephil.charting.charts.PieChart

当您尝试将一种数据类型的对象转换为另一种数据类型时,Java 会抛出 ClassCastException

问题始于

 PieChart pieChart= (PieChart) pieView; // Don't do this

试试这个方法

View pieView =  View.inflate(AppContext.context, R.layout.pie_chart,(ViewGroup)view);
PieChart pieChart= (PieChart) pieView.findViewById(R.id.piechart); 

【讨论】:

  • 我认为我的膨胀视图已添加到片段的布局中,并且 View.inflate() 返回了我的膨胀视图的引用。你能对此发表评论吗?
  • @VygintasB 我猜是View pieView = View.inflate(AppContext.context 造成问题
  • 经过一点研究发现,如果我为 View.inflate() 方法提供根视图,它将返回带有我膨胀视图的新根视图,但如果我为 View.inflate 添加 null () 方法,它只会返回我的膨胀视图
  • @VygintasB 是的。您可以将其发布为答案
【解决方案2】:

经过一些研究,我发现如果我为 View.inflate() 方法提供根视图,它将返回带有我膨胀视图的新根视图,但如果我为 View.inflate() 方法添加 null 它只会返回我的膨胀视图。

E.G

这将返回Linearlayout,因为view 根视图是LinearLayout

LinearLayout pieView =  View.inflate(AppContext.context, R.layout.pie_chart,(ViewGroup)view);

但如果我添加 null 它会膨胀我提供的视图。对于这种情况,它是饼图

PieChart pieView =  View.inflate(AppContext.context, R.layout.pie_chart,null);

【讨论】:

  • 是的。谢谢分享
【解决方案3】:

将您的代码更新为:

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_overview, container, false);

    View pieView =  View.inflate(AppContext.context, R.layout.pie_chart,(ViewGroup)view);
    PieChart pieChart= (PieChart) pieView.findViewById(R.id.piechart);

    return view;
}

您只是将片段视图投射到 PieChart,因此您收到此错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多