MPandroidGraph не показывает данные во фрагменте, только синий кружок

#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") его, он работает правильно

это заняло слишком много времени, чтобы понять

мне нужен перерыв