Android developmentAndroid tutorial

Android bar chart with Tooltip example

Hii Developer in this Android Tutorial, I am sharing how to make an Android bar chart with Tooltip example to show bar value in android. In this Android example, I am getting data for a rest API  and API response we show in a bar chart. Add on this user can click on the Bar chart showing a Tooltip for Bar Value and Title.

Android bar chart with Tooltip example shows data with server API. In today’s customer requirements and user-friendly app-making I very difficult to show we can add a new thing with a bar chart to show data in Bar chart Tooltip. So Just Follow these Simple Steps for Do.

Step 1:-  Add PhilJay MPAndroidChart Bar Chart Chart Dependency.

implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'

 Step 2: Make a Bar Chart Layout in your XML file and add these.

<com.github.mikephil.charting.charts.BarChart
    android:id="@+id/Monitoring_Memory_PieChart"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minHeight="320dp" />

Step 3: Implement a java class and add an API response on the Bar Chart.

public class Home extends AppCompatActivity implements OnChartValueSelectedListener {
BarChart BarChart;
ArrayList<DataObject> CPU_BarChart = new ArrayList<>();
ArrayList<String> serviceCPUStringList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_advanced_monitoring_home);
    FindViewById();
    androidx.appcompat.app.ActionBar actionBar = getSupportActionBar();
    actionBar.setHomeButtonEnabled(true);
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setTitle("Codeplayon");
    BarChart =(BarChart)findViewById(R.id.Monitoring_CPU_PieChart);
    initializeCPUBarChart()
    Service_CpuCout();
}

private void initializeCPUBarChart() {
        BarChart.getDescription().setEnabled(false);
        BarChart.setPinchZoom(true);
        BarChart.getAxisLeft().setDrawGridLines(false);
        BarChart.getAxisRight().setDrawGridLines(false);
        BarChart.getAxisRight().setEnabled(false);
        BarChart.animateY(1500);
        BarChart.getLegend().setEnabled(false);
        BarChart.getAxisRight().setDrawLabels(false);
        BarChart.setDoubleTapToZoomEnabled(false);
        Monitoring_CPU_BarChart.setOnChartValueSelectedListener(this);
        Monitoring_CPU_BarChart.setDrawBarShadow(false);
        BarChart.setDrawValueAboveBar(true);
        BarChart.getDescription().setEnabled(false);
        // scaling can now only be done on x- and y-axis separately
        BarChart.setDrawGridBackground(false);
        // chart.setDrawYLabels(false);
        XAxis xAxis = BarChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
//        xAxis.setTypeface(tfLight);
        xAxis.setDrawGridLines(false);
        xAxis.setGranularity(1f); // only intervals of 1 day
        xAxis.setLabelCount(7);
        ValueFormatter custom = new MyValueFormatter("");
        YAxis leftAxis = BarChart.getAxisLeft();
//        leftAxis.setTypeface(tfLight);
        leftAxis.setLabelCount(8, false);
        leftAxis.setValueFormatter(custom);
        leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
        leftAxis.setSpaceTop(15f);
        leftAxis.setAxisMinimum(0f); // this repla
    }
private void Service_CpuCout() {
        loading_CPU_BarChart.setVisibility(View.VISIBLE);
        // Enter the correct url for your api service site
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, ConfiURL.Top_Five_ServiceCPU+"?serviceName=CPU&noOfHost=5&graphType=SRV", null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
//                        Toast.makeText(mActivity, "String Response : " + response.toString(), Toast.LENGTH_LONG).show();
                        try {
                            loading_CPU_BarChart.setVisibility(View.GONE);
                            CUPRetry_Button.setVisibility(View.GONE);
                            Log.d("JSON", String.valueOf(response));
                            String Error = response.getString("httpStatus");
                            if (Error.equals("OK")) {
                                JSONObject body = response.getJSONObject("body");
                                JSONObject Response =body.getJSONObject("Response");
                                JSONArray  Services = Response.getJSONArray("Services");
                                for (int i = 0; i < Services.length(); i++) {
                                    JSONObject json_data = Services.getJSONObject(i);
                                    JSONArray service = json_data.getJSONArray("service");
                                    onPostServiceCpulist(service);
                                }
                            }else if(Error.equalsIgnoreCase("UNAUTHORIZED")){

                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                            loading_CPU_BarChart.setVisibility(View.GONE);
                        }
                    }
                }, error -> {
            VolleyLog.d("Error", "Error: " + error.getMessage());
            loading_CPU_BarChart.setVisibility(View.GONE);
            Monitoring_CPU_BarChart.setNoDataText("No chart data available. kindly refresh it");
            CUPRetry_Button.setVisibility(View.VISIBLE);
            if (error instanceof TimeoutError || error instanceof NoConnectionError) {


            } else if (error instanceof AuthFailureError) {

                //TODO
            } else if (error instanceof ServerError) {

                //TODO
            } else if (error instanceof NetworkError) {

                //TODO
            } else if (error instanceof ParseError) {

            }
        }) {
            @Override
            public String getBodyContentType() {
                return "application/json; charset=utf-8";
            }

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Authorization", new SessionManagement().getSavedToken(AdvancedMonitoringHome.this));
                return headers;
            }
        };
        requestQueue = Volley.newRequestQueue(getApplicationContext());
        jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(10000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        requestQueue.add(jsonObjectRequest);
    }

    protected void onPostServiceCpulist(JSONArray result) {
        //this method will be running on UI thread
        ArrayList<DataObject> data = new ArrayList<>();
        data.equals(null);
        try {
            // Extract data from json and store into ArrayList as class objects
            for (int i = 0; i < result.length(); i++) {
                JSONObject json_data = result.getJSONObject(i);
                DataObject report = new DataObject();
                report.mText2 = json_data.getString("perfometer");
                String thisString=json_data.getString("alias");
                String first ;//"hello"
                if (thisString.length() > 7)
                {
                    first = thisString.substring(0, 7);
                }
                else
                {
                    first = thisString;
                }

                report.mText3 = first+"...";
                data.add(report);
                serviceCPUStringList.add(report.mText3);
            }
            CPU_BarChart = data;
            createCPUBarChart(CPU_BarChart);

        } catch (JSONException e) {
        }
    }
    private void createCPUBarChart(ArrayList<DataObject> severityListServer) {
        ArrayList<BarEntry> values = new ArrayList<>();

        for (int i = 0; i < severityListServer.size(); i++) {
            DataObject dataObject = severityListServer.get(i);
            values.add(new BarEntry(i, Integer.parseInt(dataObject.mText2)));
        }

        BarDataSet set1;

        if (BarChart.getData() != null && BarChart.getData().getDataSetCount() > 0) {
            set1 = (BarDataSet) BarChart.getData().getDataSetByIndex(0);
            set1.setValues(values);
            BarChart.getData().notifyDataChanged();
            BarChart.notifyDataSetChanged();
        } else {
            set1 = new BarDataSet(values, "Data Set");
            set1.setColors(SessionManagement.BarCHART_COLORS_Top5);
            set1.setDrawValues(true);
            ArrayList<IBarDataSet> dataSets = new ArrayList<>();
            dataSets.add(set1);
            YAxis y = Monitoring_CPU_BarChart.getAxisLeft();
            y.setAxisMinValue(0);
            y.setLabelCount(4);
            y.setAxisMaxValue(120);
            BarData data = new BarData(dataSets);
            BarChart.setData(data);
            BarChart.setFitBars(true);
            XAxis xAxis = Monitoring_CPU_BarChart.getXAxis();
            xAxis.setGranularity(1f);
            xAxis.setGranularityEnabled(true);
            xAxis.setCenterAxisLabels(false);
            xAxis.setValueFormatter(new IndexAxisValueFormatter(serviceCPUStringList));//setting String values in Xaxis
            BarChart.invalidate();
            XYMarkerView mv = new XYMarkerView(this,new IndexAxisValueFormatter(serviceCPUStringList) );
            mv.setChartView(BarChart); // For bounds control
            BarChart.setMarker(mv);

        }
    }

Step 4: Make a java class with the name XYMarkerView.

In these classes, we create a Tooltip marker showing on click on Bar chart slice showing title and value in Android.

import android.content.Context;
import android.widget.TextView;

import com.github.mikephil.charting.components.MarkerView;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.utils.MPPointF;
import com.netmagic.netmagicntt.R;

import java.text.DecimalFormat;

public class XYMarkerView extends MarkerView {

    private final TextView tvContent;
    private final ValueFormatter xAxisValueFormatter;

    private final DecimalFormat format;

    public XYMarkerView(Context context, ValueFormatter xAxisValueFormatter) {
        super(context, R.layout.custom_marker_view);

        this.xAxisValueFormatter = xAxisValueFormatter;
        tvContent = findViewById(R.id.tvContent);
        format = new DecimalFormat("###.0");
    }

    // runs every time the MarkerView is redrawn, can be used to update the
    // content (user-interface)
    @Override
    public void refreshContent(Entry e, Highlight highlight) {

//        tvContent.setText(String.format("Name: %s, Value: %s", xAxisValueFormatter.getFormattedValue(e.getX()), format.format(e.getY())));

        tvContent.setText(String.format(" Value: %s", format.format(e.getY())));

        super.refreshContent(e, highlight);
    }

    @Override
    public MPPointF getOffset() {
        return new MPPointF(-(getWidth() / 2), -getHeight());
    }
}