溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android?ViewBinding如何使用

發(fā)布時(shí)間:2022-09-09 09:58:30 來(lái)源:億速云 閱讀:289 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Android ViewBinding如何使用”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    一、kotlin-android-extensions

    在使用ViewBinding之前,我們一直使用的是kotlin-android-extensions,使用kotlin-android-extensions可以節(jié)約很多寫findViewById的時(shí)間。不過這個(gè)kotlin-android-extensions插件已經(jīng)廢棄了,簡(jiǎn)單說一下kotlin-android-extensions存在的問題:

    1.通過反編譯kotlin-android-extensions的代碼,發(fā)現(xiàn)會(huì)創(chuàng)建一個(gè)HashMap,用來(lái)存放所有的id和對(duì)應(yīng)的View的緩存,如果緩存中沒有View,那么就通過findViewById去創(chuàng)建并存入緩存,否則就直接獲取。所以會(huì)存在內(nèi)存問題。

    private HashMap _$_findViewCache;
    public View _$_findCachedViewById(int var1) {
       if (this._$_findViewCache == null) {
          this._$_findViewCache = new HashMap();
       }
       View var2 = (View)this._$_findViewCache.get(var1);
       if (var2 == null) {
          View var10000 = this.getView();
          if (var10000 == null) {
             return null;
          }
          var2 = var10000.findViewById(var1);
          this._$_findViewCache.put(var1, var2);
       }
       return var2;
    }
    public void _$_clearFindViewByIdCache() {
       if (this._$_findViewCache != null) {
          this._$_findViewCache.clear();
       }
    }
    // $FF: synthetic method
    public void onDestroyView() {
       super.onDestroyView();
       this._$_clearFindViewByIdCache();
    }

    2.由于kotlin-android-extensions是通過view的id名直接引用的,如果多個(gè)布局間的同名id,就需要手動(dòng)對(duì)import進(jìn)行重命名處理,如果引用錯(cuò)誤的布局文件,就會(huì)出現(xiàn)crash。所以存在資源重名的問題。

    3.只有Kotlin才可以使用。

    所以ViewBinding優(yōu)勢(shì)有:java,kotlin都可以使用,可以有效避免NullPointerException。

    二、ViewBinding使用

    1.gradle配置

    buildFeatures {
        viewBinding true
    }

    開啟ViewBinding之后,在編譯時(shí),AGP會(huì)自動(dòng)幫我們給每個(gè)xml布局創(chuàng)建一個(gè)Binding類,位于build/generated/data_binding_base_class_source_out/目錄下。

    Android?ViewBinding如何使用

    public final class FragmentLoginBinding implements ViewBinding {
      @NonNull
      private final ConstraintLayout rootView;
      @NonNull
      public final ConstraintLayout container;
      @NonNull
      public final ProgressBar loading;
      @NonNull
      public final Button login;
      @NonNull
      public final EditText password;
      @NonNull
      public final EditText username;
      private FragmentLoginBinding(@NonNull ConstraintLayout rootView,
          @NonNull ConstraintLayout container, @NonNull ProgressBar loading, @NonNull Button login,
          @NonNull EditText password, @NonNull EditText username) {
        this.rootView = rootView;
        this.container = container;
        this.loading = loading;
        this.login = login;
        this.password = password;
        this.username = username;
      }
      @Override
      @NonNull
      public ConstraintLayout getRoot() {
        return rootView;
      }
      @NonNull
      public static FragmentLoginBinding inflate(@NonNull LayoutInflater inflater) {
        return inflate(inflater, null, false);
      }
      @NonNull
      public static FragmentLoginBinding inflate(@NonNull LayoutInflater inflater,
          @Nullable ViewGroup parent, boolean attachToParent) {
        View root = inflater.inflate(R.layout.fragment_login, parent, false);
        if (attachToParent) {
          parent.addView(root);
        }
        return bind(root);
      }
      @NonNull
      public static FragmentLoginBinding bind(@NonNull View rootView) {
        // The body of this method is generated in a way you would not otherwise write.
        // This is done to optimize the compiled bytecode for size and performance.
        int id;
        missingId: {
          ConstraintLayout container = (ConstraintLayout) rootView;
          id = R.id.loading;
          ProgressBar loading = rootView.findViewById(id);
          if (loading == null) {
            break missingId;
          }
          id = R.id.login;
          Button login = rootView.findViewById(id);
          if (login == null) {
            break missingId;
          }
          id = R.id.password;
          EditText password = rootView.findViewById(id);
          if (password == null) {
            break missingId;
          }
          id = R.id.username;
          EditText username = rootView.findViewById(id);
          if (username == null) {
            break missingId;
          }
          return new FragmentLoginBinding((ConstraintLayout) rootView, container, loading, login,
              password, username);
        }
        String missingId = rootView.getResources().getResourceName(id);
        throw new NullPointerException("Missing required view with ID: ".concat(missingId));
      }
    }

    注意:

    1.因?yàn)檫@些類編譯時(shí)就生成了,就不會(huì)占用運(yùn)行時(shí)內(nèi)存。

    2.未使用的Binding文件會(huì)在混淆時(shí)被刪除,所以對(duì)包大小影響很小。

    3.編譯器生成Binding文件是增量更新的。

    那么如何不生成Binding類呢?tools:viewBindingIgnore="true"

    <androidx.constraintlayout.widget.ConstraintLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:viewBindingIgnore="true"
        tools:context=".MainActivity">

    2.在Activity 使用

    class TestViewBindingActivity : AppCompatActivity() {
        private lateinit var bindding: ActivityTestViewBindingBinding
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            bindding = ActivityTestViewBindingBinding.inflate(layoutInflater)
            setContentView(bindding.root)
            changeText()
        }
        private fun changeText() {
            bindding.titleTv.text = "哈哈,在Activity中使用ViewBinding了"
        }
    }
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".testviewbinding.TestViewBindingActivity">
        <TextView
            android:id="@+id/titleTv"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:gravity="center"
            android:text="在Activity中使用ViewBinding"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

    Android?ViewBinding如何使用

    3.在Fragment使用

    class TextViewBindingFragment : Fragment() {
        private var param1: String? = null
        private var param2: String? = null
        private var _binding: FragmentTextViewBindingBinding? = null
        private val binding get() = _binding!!
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            arguments?.let {
                param1 = it.getString(ARG_PARAM1)
                param2 = it.getString(ARG_PARAM2)
            }
        }
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            _binding = FragmentTextViewBindingBinding.inflate(layoutInflater, container, false)
            return binding.root
        }
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            changeText()
        }
        private fun changeText() {
            binding.tvTitle.text = "哈哈,在Fragment中使用ViewBinding"
        }
        override fun onDestroyView() {
            super.onDestroyView()
            _binding = null
        }
        companion object {
            @JvmStatic
            fun newInstance(param1: String, param2: String) =
                TextViewBindingFragment().apply {
                    arguments = Bundle().apply {
                        putString(ARG_PARAM1, param1)
                        putString(ARG_PARAM2, param2)
                    }
                }
            @JvmStatic
            fun newInstance() = TextViewBindingFragment()
        }
    }
    class TestViewBindingActivity : AppCompatActivity() {
        private lateinit var bindding: ActivityTestViewBindingBinding
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            bindding = ActivityTestViewBindingBinding.inflate(layoutInflater)
            setContentView(bindding.root)
            val newInstance = TextViewBindingFragment.newInstance()
            addFragment(
                supportFragmentManager,
                newInstance,
                isAllowStateLoss = true,
                frameId = R.id.fragmentFrame
            )
        }
    }
    <?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=".testviewbinding.TextViewBindingFragment">
        <TextView
            android:id="@+id/tvTitle"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="在Fragment中" />
    </FrameLayout>

    Android?ViewBinding如何使用

    4.在Adapter中使用

    class TestAdapterActivity : AppCompatActivity() {
        private lateinit var binding: ActivityTestAdapterBinding
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityTestAdapterBinding.inflate(layoutInflater)
            setContentView(binding.root)
            initView()
        }
        companion object {
            val ITEMS = mutableListOf<String>("1", "2", "3", "4", "5", "6")
        }
        private fun initView() {
            with(binding.contentRcycler) {
                layoutManager = GridLayoutManager(context, 4)
                adapter = TestRecyclerViewAdapter(ITEMS)
            }
        }
    }
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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=".testviewbinding.TestAdapterActivity">
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/contentRcycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    class TestRecyclerViewAdapter(private val values: List<String>) :
        RecyclerView.Adapter<TestRecyclerViewAdapter.ViewHolder>() {
        inner class ViewHolder(binding: RecyclerItemLayoutBinding) :
            RecyclerView.ViewHolder(binding.root) {
            val textTv = binding.contentTv
        }
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            return ViewHolder(
                RecyclerItemLayoutBinding.inflate(
                    LayoutInflater.from(parent.context),
                    parent,
                    false
                )
            )
        }
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val item = values[position]
            holder.textTv.text = item
        }
        override fun getItemCount(): Int = values.size
    }
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="200dp">
        <TextView
            android:id="@+id/contentTv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:textSize="16dp"
            tools:text="99" />
    </androidx.constraintlayout.widget.ConstraintLayout>

    Android?ViewBinding如何使用

    5.在Dialog中使用

    class CommonDialog(context: Context) : Dialog(context) {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(DialogLayoutBinding.inflate(layoutInflater).root)
        }
    }
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/dialogContent"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:text="This is Dialog"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

    Android?ViewBinding如何使用

    6.Include中使用

    class TestIncludeActivity : AppCompatActivity() {
        private lateinit var binding: ActivityTestIncludeBinding
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding = ActivityTestIncludeBinding.inflate(layoutInflater)
            setContentView(binding.root)
            initView()
        }
        private fun initView() {
            binding.itemInclude.itemContentTv.text = "哈哈, this is include"
        }
    }
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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=".testviewbinding.TestIncludeActivity">
        <include
            android:id="@+id/itemInclude"
            layout="@layout/item_layout" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/itemContentTv"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:text="Test include"
            android:textSize="30sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

    Android?ViewBinding如何使用

    三、ViewBinding封裝

    1.在BaseActivity中封裝

    abstract class BaseViewBindingActivity<T : ViewBinding> : AppCompatActivity() {
        protected val binding by lazy {
            getViewBinding()
        }
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(binding.root)
        }
        protected abstract fun getViewBinding(): T
    }
    class ChildViewBindingMainActivity :
        BaseViewBindingActivity<ActivityChildViewBindingMainBinding>() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding.titleTv.text = "哈哈,this is child binding activity"
        }
        override fun getViewBinding(): ActivityChildViewBindingMainBinding {
            return ActivityChildViewBindingMainBinding.inflate(layoutInflater)
        }
    }
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".encapsulatviewbinding.ChildViewBindingMainActivity">
        <TextView
            android:id="@+id/titleTv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="36sp" />
    </androidx.constraintlayout.widget.ConstraintLayout>

    Android?ViewBinding如何使用

    2.通過反射的方式封裝

    class TestViewBindingMainActivity : AppCompatActivity() {
        private val binding by inflate<ActivityTestViewBindingMainBinding>()
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding.titleTv.text = "哈哈,通過反射封裝ViewBinding"
        }
    }
    inline fun <reified T : ViewBinding> inflateByViewBinding(layoutInflater: LayoutInflater) =
        T::class.java.getMethod("inflate", LayoutInflater::class.java).invoke(null, layoutInflater) as T
    inline fun <reified T : ViewBinding> Activity.inflate() = lazy {
        inflateByViewBinding<T>(layoutInflater).apply {
            setContentView(root)
        }
    }
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".encapsulatviewbinding.TestViewBindingMainActivity">
        <TextView
            android:id="@+id/titleTv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:textSize="36sp" />
    </androidx.constraintlayout.widget.ConstraintLayout>

    Android?ViewBinding如何使用

    3.反射+基類

    1.在Activity 中使用
    abstract class BaseBindingMainActivity2<T : ViewBinding> : AppCompatActivity() {
        protected lateinit var binding: T
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val type = javaClass.genericSuperclass
            if (type is ParameterizedType) {
                val clazz = type.actualTypeArguments[0] as Class<T>
                val method = clazz.getMethod("inflate", LayoutInflater::class.java)
                binding = method.invoke(null, layoutInflater) as T
            }
            setContentView(binding.root)
        }
    }
    class ChildViewBindingMainActivity2 :
        BaseBindingMainActivity2<ActivityChildViewBindingMain2Binding>() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            binding.titleTv.text = "哈哈,這是反射+基類的方式"
        }
    }
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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=".encapsulatviewbinding.ChildViewBindingMainActivity2">
        <TextView
            android:id="@+id/titleTv"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

    Android?ViewBinding如何使用

    2.在Fragment中使用
    abstract class BaseBindingViewFragment<T : ViewBinding> : Fragment() {
        private var _binding: T? = null
        protected val binding get() = _binding!!
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            val type = javaClass.genericSuperclass
            val clazz = (type as ParameterizedType).actualTypeArguments[0] as Class<T>
            val method = clazz.getMethod(
                "inflate",
                LayoutInflater::class.java,
                ViewGroup::class.java,
                Boolean::class.java
            )
            _binding = method.invoke(null, layoutInflater, container, false) as T
            this.viewLifecycleOwner.lifecycle.addObserver(object : LifecycleEventObserver {
                override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
                    if (event == Lifecycle.Event.ON_DESTROY) {
                        Log.v(TAG, "onDestroy binding be null")
                        _binding = null
                    }
                }
            })
            return binding.root
        }
        companion object {
            const val TAG = "BaseBindingViewFragment"
        }
    }
    class ChildBindingFragment : BaseBindingViewFragment<FragmentChildBindingBinding>() {
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            return super.onCreateView(inflater, container, savedInstanceState)
        }
        companion object {
            @JvmStatic
            fun newInstance() = ChildBindingFragment()
        }
    }
    class TestBindingMainActivity3 : BaseBindingMainActivity2<ActivityTestBindingMain3Binding>() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val newInstance = ChildBindingFragment.newInstance()
            addFragment(
                supportFragmentManager,
                newInstance,
                isAllowStateLoss = true,
                frameId = R.id.frame
            )
        }
    }
    <?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=".encapsulatviewbinding.ChildBindingFragment">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/hello_blank_fragment" />
    </FrameLayout>

    Android?ViewBinding如何使用

    4.委托的方式

    class TestViewBindingFragment2 : Fragment(R.layout.fragment_test_view_binding2) {
        private val binding by inflate<FragmentTestViewBinding2Binding>()
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            binding.root
        }
        companion object {
            @JvmStatic
            fun newInstance() = TestViewBindingFragment2()
        }
    }
    inline fun <reified T : ViewBinding> Fragment.inflate() =
        FragmentViewBindingDelegate(T::class.java)
    class FragmentViewBindingDelegate<T : ViewBinding>(private val clazz: Class<T>) :
        ReadOnlyProperty<Fragment, T> {
        private var binding: T? = null
        override fun getValue(thisRef: Fragment, property: KProperty<*>): T {
            if (binding == null) {
                binding =
                    clazz.getMethod("bind", View::class.java).invoke(null, thisRef.requireView()) as T
                thisRef.viewLifecycleOwner.lifecycle.addObserver(object : LifecycleEventObserver {
                    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
                        if (event == Lifecycle.Event.ON_DESTROY) {
                            binding = null
                        }
                    }
                })
            }
            return binding!!
        }
    }
    <?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=".encapsulatviewbinding.TestViewBindingFragment2">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="8888888" />
    </FrameLayout>

    Android?ViewBinding如何使用

    “Android ViewBinding如何使用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI