1. 程式人生 > >碎片中在使用碎片(餅形圖+水平柱形圖)

碎片中在使用碎片(餅形圖+水平柱形圖)

筆記 在main方法裡呼叫DataAnalysisMainFragment碎片

getSupportFragmentManager().beginTransaction().replace(R.id.maincontent, new DataAnalysisMainFragment(MainActivity.this)).commit();
                        tv_title.setText(actionTexts[position]);

xml介面佈局,由於是碎片裡的活動 使用了FrameLayout 也可以使用LinearLayout

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
    android:orientation="vertical"
             tools:context="com.gsandroid.trafficclient.fragment.DataAnalysisMainFragment">



             <LinearLayout

                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:orientation="vertical">

                 <android.support.v4.view.ViewPager
                     android:id="@+id/vp_data"
                     android:layout_width="match_parent"
                     android:layout_weight="8"
                     android:layout_height="0dp">

                 </android.support.v4.view.ViewPager>

                 <RadioGroup
                     android:id="@+id/rg_analysis"
                     android:layout_width="match_parent"
                     android:layout_height="0dp"
                     android:orientation="horizontal"
                     android:gravity="center"
                     android:layout_weight="1">
                     <RadioButton
                         android:id="@+id/rb_1"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         />
                     <RadioButton
                         android:id="@+id/rb_2"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content" />
                 </RadioGroup>
             </LinearLayout>

</FrameLayout>

DataAnalysisMainFragment的程式碼

package com.gsandroid.trafficclient.fragment;


import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;
import android.widget.TextView;

import com.gsandroid.trafficclient.FragmentAdapter.VPDataAnalysisGraphAdapter;
import com.gsandroid.trafficclient.R;

import java.util.ArrayList;
import java.util.List;

/**
 * A simple {@link Fragment} subclass.
 */
@SuppressLint("ValidFragment")
public class DataAnalysisMainFragment extends Fragment {
Context context;

    private ViewPager vp_data;//
    private RadioGroup rg_analysis;//分組
    private TextView tv_explan;
    List<DataAnalysisFragmentFragmentPicChart> fragments;//儲存子碎片的list
    private View view;


    @SuppressLint("ValidFragment")
    public DataAnalysisMainFragment(Context context) {//構造方法  傳遞上下文
            this.context=context;
    }

//onCreateView相當於活動的oncreate,在view裡填充佈局 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_data_analysis_main, container, false);
        vp_data = (ViewPager) view.findViewById(R.id.vp_data);
        rg_analysis = (RadioGroup) view.findViewById(R.id.rg_analysis);
        init();
        return view;

    }
//初始 給分組確定引數
    public void init(){
        rg_analysis.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                switch (i){
                    case R.id.rb_1:
                        vp_data.setCurrentItem(0,false);
                        break;
                    case R.id.rb_2:
                        vp_data.setCurrentItem(1,false);
                        break;
                }
            }
        });
//載入子碎片
        fragments=new ArrayList<DataAnalysisFragmentFragmentPicChart>();
        for (int i=0;i<2;i++){
            DataAnalysisFragmentFragmentPicChart picChart=new DataAnalysisFragmentFragmentPicChart(context,i);
            fragments.add(picChart);
        }
        VPDataAnalysisGraphAdapter vpDataAnalysisGraphAdapter = new VPDataAnalysisGraphAdapter(getFragmentManager(), fragments);
        vp_data.setAdapter(vpDataAnalysisGraphAdapter);
        vp_data.setOffscreenPageLimit(2);

        vp_data.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                switch (position){
                    case 0:
                     rg_analysis.check(R.id.rb_1);
                     break;
                    case 1:
                        rg_analysis.check(R.id.rb_2);
                        break;
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

}

子碎片xml 一個linearlayout中放了一個textview和relativelayoyt 其中relativelayout就是圖形

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

        <TextView
            android:id="@+id/tv_explan"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:text="平臺上有違章和無違章車輛的佔比統計"
            android:textSize="40dp"
            android:textColor="@color/black"
            android:gravity="center"
            />

        <RelativeLayout
            android:id="@+id/rl_pieChart"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </RelativeLayout>
</LinearLayout>

子碎片裡的方法

package com.gsandroid.trafficclient.fragment;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;


import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.charts.HorizontalBarChart;
import com.github.mikephil.charting.charts.PieChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.PieData;
import com.github.mikephil.charting.data.PieDataSet;
import com.github.mikephil.charting.data.PieEntry;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.formatter.IValueFormatter;
import com.github.mikephil.charting.formatter.PercentFormatter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;
import com.github.mikephil.charting.utils.ViewPortHandler;
import com.gsandroid.trafficclient.R;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;


@SuppressLint("ValidFragment")
public class DataAnalysisFragmentFragmentPicChart extends Fragment {
    private View view;
    private RelativeLayout rl_graph;
    private List<Entry> entryList = new ArrayList<>();
    Context context;
    private List<PieEntry> pieEntries;
    private PieChart pieChart;
    private List<Integer> colors;
    private List<BarEntry> barEntries;
    int graphIndex;
    private HorizontalBarChart horizontalBarChart;

    private BarChart barChart;
    private XAxis xAxis;
    private YAxis yAxis;
    private RelativeLayout rl_pieChart;
    private TextView tv_explan;

    @SuppressLint("ValidFragment")
    public DataAnalysisFragmentFragmentPicChart(Context context, int graphIndex) {
        this.context = context;
        this.graphIndex = graphIndex;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_data_analysis_piechart, container, false);
        rl_pieChart = (RelativeLayout) view.findViewById(R.id.rl_pieChart);
        tv_explan = (TextView) view.findViewById(R.id.tv_explan);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);//載入佈局
        params.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
        switch (graphIndex) {//判斷是哪個子碎片
            case 0:
                PieChart pieChart = getPieChart();
                getEntries();
                rl_pieChart.addView(pieChart, params);
                tv_explan.setText("平臺上有違章和無違章車輛的佔比統計");
                break;
            case 1:
                HorizontalBarChart horizontalBarChart = getBarChart();
                rl_pieChart.addView(horizontalBarChart, params);
                tv_explan.setText("排名前三位的違章統計佔比");
                break;

        }
        return view;
    }

    public PieChart getPieChart() {//餅形圖
        pieChart = new PieChart(context);
        pieChart.setHoleRadius(10f);
        pieChart.setHoleRadius(0);
        pieChart.setDrawCenterText(true);
        pieChart.setDrawHoleEnabled(true);
        pieChart.setRotationAngle(90);
        pieChart.setRotationEnabled(true);
        pieChart.setUsePercentValues(true);
        pieChart.setCenterText("v");
        Legend m = pieChart.getLegend();
        m.setXEntrySpace(3f);
        m.setYEntrySpace(2f);
        pieChart.animateXY(1000, 1000);
        return pieChart;
    }

    public void getEntries() {//餅形圖
        if (pieChart != null) {
            if (graphIndex == 0) {
                pieEntries = new ArrayList<>();
                pieEntries.add(new PieEntry(60, "有違章"));
                pieEntries.add(new PieEntry(440, "無違章"));
                colors = new ArrayList<>();
                colors.add(Color.parseColor("#303F9F"));
                colors.add(Color.parseColor("#E33532"));
            }

            PieDataSet pieDataSet = new PieDataSet(pieEntries, "");
            pieDataSet.setColors(colors);

            PieData pieData = new PieData(pieDataSet);
            pieData.setValueFormatter(new PercentFormatter());
            pieChart.setData(pieData);
            pieChart.invalidate();
        }
    }
//水平柱形圖
    public HorizontalBarChart getBarChart() {
        horizontalBarChart = new HorizontalBarChart(context);
        horizontalBarChart.setDrawBarShadow(false);
        horizontalBarChart.setDrawBarShadow(true);
        horizontalBarChart.getDescription().setEnabled(false);
        horizontalBarChart.setMaxVisibleValueCount(100);
        horizontalBarChart.setPinchZoom(false);
        horizontalBarChart.setDrawGridBackground(false);
        horizontalBarChart.setFitBars(true);
        XAxis xAxis = horizontalBarChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setAxisMinimum(0f);
        xAxis.setGranularity(1f);
        xAxis.setLabelCount(4);
        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float v, AxisBase axisBase) {
                if(v == 1){
                    return "導向車道";
                } else if(v == 2){
                    return "拒絕駛離";
                } else if(v == 3){
                    return "超速";
                }
                return "";
            }
        });
        //x
        YAxis y1 = horizontalBarChart.getAxisLeft();
        y1.setDrawAxisLine(true);
        y1.setDrawGridLines(true);
        y1.setAxisMinimum(0f);

        //y
        YAxis yr = horizontalBarChart.getAxisRight();
        yr.setDrawAxisLine(true);
        yr.setDrawGridLines(false);
        yr.setAxisMinimum(0f);
        //設定資料
        serData();
        horizontalBarChart.setFitBars(true);
        horizontalBarChart.animateY(1500);

        Legend l = horizontalBarChart.getLegend();
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
        l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        l.setDrawInside(false);
        l.setFormSize(18f);
        l.setXEntrySpace(12f);
        return horizontalBarChart;
    }

//水平柱形圖資料
    private void serData() {
        float barWidth = 61f;
        ArrayList<BarEntry> yVals = new ArrayList<>();
        yVals.add(new BarEntry(1, 30));
        yVals.add(new BarEntry(2, 20));
        yVals.add(new BarEntry(3, 10));

//水平柱形圖
        BarDataSet set1;
        if (horizontalBarChart.getData() != null && horizontalBarChart.getData().getDataSetCount() > 0) {
            set1 = (BarDataSet) horizontalBarChart.getData().getDataSetByIndex(0);

            set1.setValues(yVals);
            horizontalBarChart.getData().notifyDataChanged();
            horizontalBarChart.notifyDataSetChanged();
        } else {
            set1 = new BarDataSet(yVals, "Dataset 1");
            ArrayList<IBarDataSet> dataSets = new ArrayList<>();
            dataSets.add(set1);

            BarData data = new BarData(dataSets);
            //data.setValueTextSize(10f);
            //data.setBarWidth(barWidth);
            horizontalBarChart.setData(data);
        }

    }


}

子碎片分組介面卡

package com.gsandroid.trafficclient.FragmentAdapter;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;


import com.gsandroid.trafficclient.fragment.DataAnalysisFragmentFragmentPicChart;

import java.util.List;

public class VPDataAnalysisGraphAdapter extends FragmentPagerAdapter {

    List<DataAnalysisFragmentFragmentPicChart> fragments;

    public VPDataAnalysisGraphAdapter(FragmentManager fm, List<DataAnalysisFragmentFragmentPicChart> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    @Override
    public Fragment getItem(int i) {
       return fragments.get(i);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }
}