笔记
在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();
}
}