BarChart не должен иметь значение NULL в MPAndroidChart

Задний план:

  • Я пытаюсь отобразить гистограмму на основе нажатых фрагментов, у меня есть два фрагмента и одно действие в моем тестовом проекте.
  • Я использую MPAndroidBarchart, а для этого тестового проекта используется котлин.
  • Используемая библиотека - com.github.mikephil.charting.charts.BarChart.

У меня проблемы ниже:

  • Я получаю следующее сообщение об ошибке:

    barChart must not be null

    Я проверил сообщение журнала и получаю значение JSON перед этим сообщением. Ошибка запускается из этого куска кода barChart.data = data

  • Первый фрагмент по умолчанию не вызывается по умолчанию, но если я щелкаю второй фрагмент, а затем я щелкаю первый фрагмент, то вызывается фрагмент 1. В противном случае он не работает или вызывает указанную выше ошибку.

Прикрепил код:

Ответ JSON

[{"day":"2018-12-12","value":"1"},{"day":"2018-12-13","value":"2"},{"day":"2018-12-14","value":"3"},{"day":"2018-12-15","value":"4"},{"day":"2018-12-17","value":"5"},{"day":"2018-12-18","value":"6"},{"day":"2018-12-19","value":"7"}]

Фрагмент: 1

class FirstFragment : Fragment() {

    var volleyRequest: RequestQueue?=null
    val TestLink = "https://wwww.abc.app"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        volleyRequest= Volley.newRequestQueue(this.context)
        getTestValue(TestLink)
    }


    fun getTestValue(Url:String)
    {
        val stringReq=StringRequest(Request.Method.GET,Url,
                Listener {
                    response: String? ->
                    try {
        Log.d("Response JSON",response.toString())
                        ///Bar Chart Test
                        val jsonStringArray=response.toString()
                        println("Attempt to fetch JSON Data")
                        val entries = ArrayList<BarEntry>()
                        val labels = ArrayList<String>()
                        val arr = JSONArray(jsonStringArray)
                        for (i in 0 until arr.length()) {
                            entries.add(BarEntry(arr.getJSONObject(i).getDouble("value").toFloat(), i))
                            labels.add(arr.getJSONObject(i).getString("day"))
                        }
                        val barDataSet = BarDataSet(entries, "Test Sample Record")
                        barDataSet.valueTextSize = 10f
                        val data = BarData(labels, barDataSet)
                        Log.d("Entries", data.toString())
                        barChart.data = data 
                        barChart.setDescription("")
                        }
                    catch (e:JSONException)
                    {
                        e.printStackTrace()
                    }

                },
                Response.ErrorListener {
                    error: VolleyError? ->
                    try{
                        Log.d("Error:", error.toString())
                    }
                    catch (e:JSONException) {e.printStackTrace()}
                }
                )
        volleyRequest!!.add(stringReq)
    }
}

Основная деятельность:

class MainActivity : AppCompatActivity() {

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_home -> {
               // message.setText(R.string.title_home)
                replaceFragment(FirstFragment())
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_dashboard -> {
                //message.setText(R.string.title_dashboard)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_notifications -> {
                //message.setText(R.string.title_notifications)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
    }

    private fun replaceFragment(fragment: Fragment){
        val fragmentTransaction = supportFragmentManager.beginTransaction()
        fragmentTransaction.replace(R.id.container, fragment)
        fragmentTransaction.commit()
    }
}

active_fragment_one

<?xml version = "1.0" encoding = "utf-8"?>
<FrameLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    tools:context = "FragmentOne">

    <com.github.mikephil.charting.charts.BarChart
        android:id = "@+id/barChart"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:background = "@color/ColorBg"
        />

</FrameLayout>

где вы определяете barChart, ошибка возникает из-за того, что barChart является ненулевым варибалом.

GianhTran 20.12.2018 03:19

Спасибо @GianhTran за ваш ответ. Я определил barChart в своем действии Fragment one.

Jo......... 20.12.2018 06:01

Я также добавил ответ JSON, но не уверен, почему получаю это сообщение об ошибке.

Jo......... 20.12.2018 08:04

У меня есть ответ, пожалуйста, посмотрите

GianhTran 20.12.2018 08:17
0
4
743
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не знаю о вашем onCreateView() в FirstFragment, но ваша проблема называется представлением, когда она еще не создана, поэтому переместите свой код в onCreate в

@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        volleyRequest= Volley.newRequestQueue(this.context)
        getTestValue(TestLink)
    }

Привет, @Gianh Tran, Спасибо за объяснение. Я новичок в Fragment, поэтому не могли бы вы объяснить мне, где мне нужно добавить в код метод onViewcreated.

Jo......... 20.12.2018 08:26

потому что в onCreate мы не увеличиваем макет, поэтому вы не можете использовать здесь какой-либо вид. вам следует изучить fragment lifecycle для получения дополнительной информации

GianhTran 20.12.2018 08:31

Вау. Ваше решение сработало для меня. Не могли бы вы объяснить мне разницу между методами onCreateView и onViewCreate. Спасибо за вашу помощь.

Jo......... 20.12.2018 08:40

@JoshvaJo приятно помочь, вы можете увидеть больше в stackoverflow.com/questions/25119090/…

GianhTran 20.12.2018 08:47

Тран. Спасибо за ссылку.

Jo......... 20.12.2018 09:44

Другие вопросы по теме