我通过使用ArrayAdapter和观察器来更新数据,从而在自定义ActionBar视图(也许应该称为工具栏视图?)中拥有一个完全正常的微调器。但是,它不适用于数据绑定。通过在onResume中启用自定义视图,此微调器仅显示在一个片段上,然后恢复显示所有其他片段的标题onStop。
我想使用数据绑定来填充微调器条目,并使用双向绑定来跟踪屏幕旋转和片段更改之间的位置。我可以从viewModel的ArrayList中填充微调器,但是在布局中引用同一ArrayList的条目始终导致微调器中没有数据。
活动:
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this,
R.layout.activity_main
)
drawerLayout = binding.drawerLayout
val navController = this.findNavController(R.id.myNavHostFragment)
NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
片段:
class RecipeListFragment : Fragment() {
lateinit var recipeListViewModel: RecipeListViewModel
lateinit var ab: ActionBar
private lateinit var sView: View
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding: FragmentRecipeListBinding = DataBindingUtil.inflate(
inflater,
R.layout.fragment_recipe_list, container, false
)
val application = requireNotNull(this.activity).application
val datasource = RecipeDatabase.getInstance(application).recipeDatabaseDao
val viewModelFactory = RecipeListViewModelFactory(datasource, application)
recipeListViewModel =
ViewModelProvider(this, viewModelFactory).get(RecipeListViewModel::class.java)
binding.recipeListViewModel = recipeListViewModel
/** some code removed here for brevity **/
/** ActionBar spinner used to select categories **/
sView = layoutInflater.inflate(R.layout.custom_action_bar_layout, null)
var spinner2 = sView.spinner2
// Adapter to load spinner with categories
var spinnerArrayAdapter = ArrayAdapter(application, R.layout.spinner_item, recipeListViewModel.test_categories)
spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
spinner2.adapter = spinnerArrayAdapter
ab = (activity as AppCompatActivity?)!!.getSupportActionBar()!!
ab?.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM)
ab?.setCustomView(sView)
setHasOptionsMenu(true)
return binding.root
}
override fun onStop() {
super.onStop()
/** Restore default ActionBar view for next frament **/
//var ab = (activity as AppCompatActivity?)!!.getSupportActionBar()
//ab?.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE)
ab?.setDisplayShowCustomEnabled(false)
ab?.setDisplayShowTitleEnabled(true)
ab?.setDisplayHomeAsUpEnabled(true)
}
override fun onResume() {
super.onResume()
/** Setup custom ActionBar view for this fragment **/
ab?.setDisplayShowCustomEnabled(true)
ab?.setDisplayShowTitleEnabled(false)
ab?.setDisplayHomeAsUpEnabled(true)
}
viewModel:
val test_categories = ArrayList<String>()
init {
Timber.i("RecipeViewModel created")
resetCounter()
test_categories.addAll(arrayOf("One","Two","Three"))
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.jumptuck.recipebrowser2.recipelist.RecipeListFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Spinner
android:id="@+id/spinner2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@color/cardview_light_background" />
</LinearLayout>
</layout>
片段:
/** ActionBar spinner used to select categories **/
sView = layoutInflater.inflate(R.layout.custom_action_bar_layout, null)
ab = (activity as AppCompatActivity?)!!.getSupportActionBar()!!
ab?.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM)
ab?.setCustomView(sView)
布局:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.jumptuck.recipebrowser2.recipelist.RecipeListFragment">
<data>
<variable
name="recipeViewModel"
type="com.jumptuck.recipebrowser2.recipelist.RecipeListViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Spinner
android:id="@+id/spinner2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:entries="@{recipeViewModel.test_categories}"
android:backgroundTint="@color/cardview_light_background" />
</LinearLayout>
</layout>
可在3个不同的标签中找到完整代码: