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





