MPAndroidChart 中的 BarChart 不能为 null
BarChart must not be null in MPAndroidChart
背景:
- 我正在尝试根据单击的片段显示条形图,我的测试项目中有两个片段和一个 activity。
- 我正在使用 MPAndroidBarchart 并且 kotlin 用于此测试项目。
- 使用的库是
com.github.mikephil.charting.charts.BarChart
。
我有以下问题:
我收到以下错误消息:
barChart must not be null
我检查了日志消息,我得到了该消息之前的 JSON 值。错误是从这段代码开始的barChart.data = data
默认fragment 1默认不调用,但是如果我点击第二个Fragment,然后点击第一个fragment,就会调用Fragment 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)
}
}
主要Activity:
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>
我不知道 FirstFragment
中的 onCreateView()
,但你的问题在尚未创建时称为视图,因此请将 onCreate
中的代码移至
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
volleyRequest= Volley.newRequestQueue(this.context)
getTestValue(TestLink)
}
背景:
- 我正在尝试根据单击的片段显示条形图,我的测试项目中有两个片段和一个 activity。
- 我正在使用 MPAndroidBarchart 并且 kotlin 用于此测试项目。
- 使用的库是
com.github.mikephil.charting.charts.BarChart
。
我有以下问题:
我收到以下错误消息:
barChart must not be null
我检查了日志消息,我得到了该消息之前的 JSON 值。错误是从这段代码开始的
barChart.data = data
默认fragment 1默认不调用,但是如果我点击第二个Fragment,然后点击第一个fragment,就会调用Fragment 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)
}
}
主要Activity:
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>
我不知道 FirstFragment
中的 onCreateView()
,但你的问题在尚未创建时称为视图,因此请将 onCreate
中的代码移至
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
volleyRequest= Volley.newRequestQueue(this.context)
getTestValue(TestLink)
}