自定义操作栏/工具栏视图中的Spinner数据绑定不起作用

时间:2020-07-03 00:50:23

标签: android data-binding android-actionbar spinner android-toolbar

我通过使用ArrayAdapter和观察器来更新数据,从而在自定义ActionBar视图(也许应该称为工具栏视图?)中拥有一个完全正常的微调器。但是,它不适用于数据绑定。通过在onResume中启用自定义视图,此微调器仅显示在一个片段上,然后恢复显示所有其他片段的标题onStop。

我想使用数据绑定来填充微调器条目,并使用双向绑定来跟踪屏幕旋转和片段更改之间的位置。我可以从viewModel的ArrayList中填充微调器,但是在布局中引用同一ArrayList的条目始终导致微调器中没有数据。

问题:

  • 为什么数据绑定不起作用?
  • 我向ActionBar添加微调器的方法是一种很好的方法吗?

ArrayAdapter填充微调器(有效)

活动:

        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>

DataBinding将微调器条目留空

片段:

        /** 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个不同的标签中找到完整代码:

0 个答案:

没有答案