Android developmentAndroid tutorial

Android bar chart with Tooltip example

Android bar chart with Tooltip
1.6kviews

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

 

Welcome to my blog! I’m Ritu Malik, and here at Codeplayon.com, we are dedicated to delivering timely and well-researched content. Our passion for knowledge shines through in the diverse range of topics we cover. Over the years, we have explored various niches such as business, finance, technology, marketing, lifestyle, website reviews and many others.