2023年9月22日 星期五

【Android】 綁定 Binding


findViewById

舉例 : 
val btn: Button= findViewById(R.id.my_button_1)

視圖綁定 view binding

是一種單向綁定,可以將 view 綁定到程式碼。

啟用

開啟應用程式的 build.gradle 檔案,在 android 部分中,新增以下行:

buildFeatures {
    viewBinding = true
}

使用

class MainActivity : AppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
}

binding.myButton1.text = "A button"

數據綁定 data binding (數據與 view 雙向綁定)

啟用

在 build.gradle(Module) 檔案中,啟用 buildFeatures 區段下的 dataBinding 屬性。
buildFeatures {
   dataBinding = true
}

如要在任何 Kotlin 專案中使用資料繫結,請套用 kotlin-kapt 外掛程式。此步驟已在 build.gradle(Module) 檔案中完成。
plugins {
   id 'com.android.application'
   id 'kotlin-android'
   id 'kotlin-kapt'
}

將版面配置檔案轉成 data binding 版面配置

在目標 layout 檔的根元素上按一下滑鼠右鍵,然後選取「Show Context Actions」>「Convert to data binding layout」

使用

在 UI controller 中使用

class ScannerSimpleResultFragment : Fragment() {
    private lateinit var binding: FragmentScannerSimpleResultBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        binding = DataBindingUtil.inflate(inflater,
            R.layout.fragment_scanner_simple_result, container, false)
        return binding.root
    }

}

binding.textViewUnscrambledWord.text = viewModel.currentScrambledWord

在 layout file 中使用

<data>
    <variable
        name="gameViewModel"
        type="com.example.android.unscramble.ui.game.GameViewModel" />
    <variable
        name="maxNoOfWords"
        type="int" />
</data>

android:text="@{gameViewModel.currentScrambledWord}"

也可以調用 viewModel  中的函式 :
<RadioButton
                    android:id="@+id/vanilla"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/vanilla"
                    android:checked="@{viewModel.flavor.equals(@string/vanilla)}"
                    android:onClick="@{() -> viewModel.setFlavor(@string/vanilla)}"/>
(使用無參數 lambda 呼叫 viewModel 內的 setFlavor 函式)

(上面的 setFlavor() 在 viewModel 中長這樣)
fun setFlavor(desiredFlavor: String) {
    _flavor.value = desiredFlavor
}


參考資料

相關文章

0 comments:

張貼留言