如何解决如何在设置片段中添加共享首选项并使用导航组件在 android kotlin 中的片段之间移动
我不知道如何在设置片段中添加共享首选项,也不知道如何使用 android 导航组件在片段之间移动,用户可以在其中更改 API 键的“值”。这是我使用的 https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&orderby=time&minmag=5&limit=10
API。从 API 中,我想更改 minmag
值,用户可以在设置片段中放置 minmag
的任何值,结果应保存在共享首选项中,并且结果应显示在主活动中{ {3}}
我正在使用 kotlin,改造并遵循 android 架构组件
EarthquakeApiService.kt
private const val BASE_URL = "https://earthquake.usgs.gov/fdsnws/"
// https://earthquake.usgs.gov/fdsnws/event/1/query?format=geojson&orderby=time&minmag=5&limit=10
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
private val retrofit = Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(BASE_URL)
.build()
interface EarthquakeApiService {
@GET("event/1/query?")
suspend fun getJson (@Query("minmag") minMagnitude : String,@Query("format") formatted : String,@Query("limit") limited: String,@Query("orderby") orderBy : String) : EarthquakeResponse
}
object BookApi {
val retrofitService : EarthquakeApiService by lazy { retrofit.create(EarthquakeApiService::class.java) }
}
地震响应.kt
data class EarthquakeResponse( val features : Array<Feature> ?)
data class Feature( val properties : Properties)
data class Properties(val mag : Double,val place : String,val time : Long)
概览片段
class OverviewFragment : Fragment() {
private val viewModel: OverviewViewModel by lazy {
ViewModelProvider(this).get(OverviewViewModel::class.java)
}
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
val binding: FragmentOverviewBinding = DataBindingUtil.inflate(
inflater,R.layout.fragment_overview,container,false)
binding.viewModel = viewModel
binding.recycleList.adapter = RecyclerviewAdapter()
binding.lifecycleOwner = this
setHasOptionsMenu(true)
return binding.root
}
override fun onCreateOptionsMenu(menu: Menu,inflater: MenuInflater) {
super.onCreateOptionsMenu(menu,inflater)
inflater?.inflate(R.menu.overflow_menu,menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return NavigationUI.onNavDestinationSelected(item,requireView().findNavController())
|| super.onOptionsItemSelected(item)
}
}
概览视图模型
class OverviewViewModel : ViewModel() {
lateinit var minMagnitude : String
lateinit var orderBy: String
// Internally,we use a MutableLiveData,because we will be updating the List of MarsProperty
// with new values
private val _properties = MutableLiveData<EarthquakeResponse> ()
// The external LiveData interface to the property is immutable,so only this class can modify
val properties: LiveData<EarthquakeResponse>
get() = _properties
init {
getBookProperties()
}
private fun getBookProperties() {
viewModelScope.launch {
try {
_properties.value = BookApi.retrofitService.getJson("2","geojson","10","time")
} catch (e : Exception) {
}
}
}
}
RecyclerviewAdapter.kt
class RecyclerviewAdapter() : ListAdapter<Feature,RecyclerviewAdapter.EarthquakePropertyViewHolder>(DiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): EarthquakePropertyViewHolder {
return EarthquakePropertyViewHolder.from(parent)
}
override fun onBindViewHolder(holder: EarthquakePropertyViewHolder,position: Int) {
val item = getItem(position)
holder.bind(item)
}
class EarthquakePropertyViewHolder private constructor(val binding: EarthquakeRawBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(books: Feature) {
binding.property = books
binding.executePendingBindings()
}
companion object {
fun from(parent: ViewGroup): EarthquakePropertyViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val view = EarthquakeRawBinding.inflate(layoutInflater,parent,false)
return EarthquakePropertyViewHolder(view)
}
}
}
}
class DiffCallback : DiffUtil.ItemCallback<Feature>() {
override fun areItemsTheSame(oldItem: Feature,newItem: Feature): Boolean {
return oldItem === newItem
}
override fun areContentsTheSame(oldItem: Feature,newItem: Feature): Boolean {
return oldItem == newItem
}
}
BindingAdapter.kt
@BindingAdapter("listData")
fun bindRecyclerView(recyclerView: RecyclerView,data: EarthquakeResponse?) {
val adapter = recyclerView.adapter as RecyclerviewAdapter
if (data != null) {
adapter.submitList(data.features?.toList())
}
}
@BindingAdapter("magnitude")
fun bindAuthor(textView: TextView,magName : Double) {
val decimalFormat = DecimalFormat("0.0")
val formattedMagnitude = decimalFormat.format(magName)
textView.setText(formattedMagnitude.toString())
}
@BindingAdapter("place")
fun bindTitle(textView: TextView,titlePlace : String) {
textView.setText(titlePlace)
}
@BindingAdapter("time")
fun bindTime(textView: TextView,titleTime :Long) {
val timeFormat = SimpleDateFormat("h:mm a")
val formattedTime = timeFormat.format(titleTime)
textView.setText(formattedTime.toString())
}
@BindingAdapter("date")
fun bindDate(textView: TextView,titleTime :Long) {
val timeFormat = SimpleDateFormat("LLL dd,yyyy")
val formattedDate = timeFormat.format(titleTime)
textView.setText(formattedDate.toString())
}
主活动
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
activity_main.xml
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.kotlinearthquake.MainActivity"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<fragment
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/myNavHostFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph"
tools:ignore="MissingClass" />
</RelativeLayout>
earthquake_raw.xml
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<data>
<variable
name="property"
type="com.example.kotlinearthquake.network.Feature" />
</data>
<LinearLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="150dp"
android:orientation="horizontal"
android:paddingStart="16dp"
android:paddingLeft="16dp"
android:paddingEnd="16dp"
android:paddingRight="16dp">
<TextView
android:id="@+id/magnitude"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="center_vertical"
android:background="@drawable/magnitude_circle"
android:fontFamily="sans-serif-medium"
android:gravity="center"
android:textColor="@android:color/black"
android:textSize="16sp"
app:magnitude="@{property.properties.mag}"
tools:text="8.9" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/location_offset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:fontFamily="sans-serif-medium"
android:maxLines="1"
android:textAllCaps="true"
android:textColor="@android:color/black"
android:textSize="12sp"
tools:text="30km S of\n" />
<TextView
android:id="@+id/primary_location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:maxLines="2"
android:textColor="@android:color/black"
android:textSize="12sp"
app:place="@{property.properties.place}"
tools:text="Long placeholder that should wrap to more than 2 line of text" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:orientation="vertical">
<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:textColor="@color/textColorEarthquakeDetails"
android:textSize="12sp"
app:date="@{property.properties.time}"
tools:text="Mar 6,2010" />
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:textColor="@color/textColorEarthquakeDetails"
android:textSize="12sp"
app:time="@{property.properties.time}"
tools:text="3:00 PM" />
</LinearLayout>
</LinearLayout>
</layout>
fragment_overview.xml
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="com.example.kotlinearthquake.overview.OverviewViewModel" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context = "com.example.kotlinearthquake.MainActivity"
>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycle_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:listData="@{viewModel.properties}"
tools:listitem="@layout/earthquake_raw"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
<TextView
android:id="@+id/empty_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAppearance="?android:textAppearanceMedium"/>
<ProgressBar
android:id="@+id/loading_indicator"
style="@style/Widget.AppCompat.ProgressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
</RelativeLayout>
</layout>
我尝试过,但没有找到解决我的问题的任何好的答案..我从过去 1 个月开始就陷入困境,请帮助我,我还是 android 和 Kotlin 编程的新手。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。