Задний план:
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>
Спасибо @GianhTran за ваш ответ. Я определил barChart в своем действии Fragment one.
Я также добавил ответ JSON, но не уверен, почему получаю это сообщение об ошибке.
У меня есть ответ, пожалуйста, посмотрите
Я не знаю о вашем 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.
потому что в onCreate мы не увеличиваем макет, поэтому вы не можете использовать здесь какой-либо вид. вам следует изучить fragment lifecycle для получения дополнительной информации
Вау. Ваше решение сработало для меня. Не могли бы вы объяснить мне разницу между методами onCreateView и onViewCreate. Спасибо за вашу помощь.
@JoshvaJo приятно помочь, вы можете увидеть больше в stackoverflow.com/questions/25119090/…
Тран. Спасибо за ссылку.
где вы определяете
barChart, ошибка возникает из-за того, чтоbarChartявляется ненулевым варибалом.