碎片中在使用碎片(餅形圖+水平柱形圖)
阿新 • • 發佈:2018-12-21
筆記 在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();
}
}