在膨胀的视图上投射自定义视图

Vyg*_*s B 0 android casting view

我有这样的布局

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" />
Run Code Online (Sandbox Code Playgroud)

我正在尝试将PieChart类型转换为View I inflated.我正在使用MPAndroidchart绘制图形.PieChart的父类扩展了VieGroup,所以我假设Cast上的Casting PieChart类型应该是正确的,但是这给了我一个错误.

导致问题的代码:

   @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;
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Int*_*iya 6

你来了

java.lang.ClassCastException:android.widget.LinearLayout无法强制转换为com.github.mikephil.charting.charts.PieChart

一个ClassCastException异常是由Java的当您尝试施放一个数据类型的对象到另一个抛出.

问题始于

 PieChart pieChart= (PieChart) pieView; // Don't do this
Run Code Online (Sandbox Code Playgroud)

试试这种方式

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

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

Vyg*_*s B 5

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

例如

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

LinearLayout pieView =  View.inflate(AppContext.context, R.layout.pie_chart,(ViewGroup)view);
Run Code Online (Sandbox Code Playgroud)

但如果我添加 null ,它会膨胀我提供的视图。对于本例,它是饼图

PieChart pieView =  View.inflate(AppContext.context, R.layout.pie_chart,null);
Run Code Online (Sandbox Code Playgroud)