#android #kotlin #android-fragments #mpandroidchart
Вопрос:
Я попытался поместить круговую диаграмму во фрагмент, но я не могу понять, как заставить ее отображать данные. Если бы он работал правильно, он был бы красным и зеленым, но он синий. Из всего, что я могу найти, я все делаю правильно, но все, что он делает, — это показывает синюю круговую диаграмму.
Я изначально не мог понять, как получить доступ к классу представления во фрагменте, чтобы я мог найти круговую диаграмму, но я понял это, и вот что это дало мне.
Я попытался изменить параметры в PieEntry, и ничего из того, что я сделал, не исправило это
В моем fragment_first.xml файл, у меня есть это
<com.github.mikephil.charting.charts.PieChart
android:id="@ id/PieChartBaby"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
В первом фрагменте.kt у меня есть
class FirstFragment() : Fragment() {
private var _binding: FragmentFirstBinding? = null
lateinit var pieChartHandler: PieChartHandler
val debugTag = "FirstFragment_DEBUG"
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentFirstBinding.inflate(inflater, container, false)
pieChartHandler = PieChartHandler(binding.root)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.buttonFirst.setOnClickListener {
findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
}
pieChartHandler.generatePieData(3445.0f, 6000.0f)
pieChartHandler.triggerAnimate()
}
fun goToNextView() {
findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
и я использую класс не связанный с деятельностью который обрабатывает все данные круговой диаграммы
class PieChartHandler(view: View){
val view = view
val debugTag = "PieChartHandler_DEBUG"
var pieChart = view.findViewById<PieChart>(R.id.PieChartBaby)
val currentStepsText = view.findViewById<TextView>(R.id.currentStepsText)
val stepsGoalText = view.findViewById<TextView>(R.id.stepGoalText)
fun generatePieData(steps: Float, goal: Float) {
Log.d(debugTag, "Generating pie chart data... Steps: $steps, goal $goal")
val pieElements = ArrayList<PieEntry>()
val pieColors = ArrayList<Int>()
if (steps <= goal) {
// if goal has not been met, calculate normally
pieElements.add(PieEntry(steps, ""))
pieElements.add(PieEntry(goal - steps, ""))
} else {
// if goal has been met, set red to none to avoid weird pie chart
pieElements.add(PieEntry(steps, ""))
pieElements.add(PieEntry(0f, ""))
}
pieColors.add(R.color.good_green)
pieColors.add(R.color.to_go_red)
val pieDataSet = PieDataSet(pieElements, "")
pieDataSet.colors = pieColors
val pieData = PieData(pieDataSet)
pieData.setValueTextSize(0f)
pieChart.data = pieData
pieChart.invalidate()
currentStepsText.text = pieElements[0].toString()
stepsGoalText.text = pieElements[1].toString()
formatPieData()
}
private fun formatPieData() {
pieChart.setUsePercentValues(false)
pieChart.setDrawMarkers(false)
pieChart.isDrawHoleEnabled = true
pieChart.setHoleColor(R.color.design_default_color_background)
pieChart.holeRadius = 70f
pieChart.description.isEnabled = false
pieChart.setDrawEntryLabels(false)
pieChart.legend.isEnabled = false
}
fun triggerAnimate() {
Log.d(debugTag, "Pie chart animation triggered")
pieChart.animateY(1000, com.github.mikephil.charting.animation.Easing.EaseInOutQuad)
}
}
У кого-нибудь есть какие-нибудь идеи, где я ошибся?
Изменить: перемещение formatPieData() перед установкой PieChart.data не сработало
Ответ №1:
ошибкой было использовать класс R для вызова R.color.{color}
если вы используете Color.parseColor("#color")
его, он работает правильно
это заняло слишком много времени, чтобы понять
мне нужен перерыв