对于ViewBinding的封装
不说废话,直接上代码。
使用Java的封装
首先我们定义两个转换接口,后面要用。
import androidx.annotation.NonNull;
public interface Function1<P1, R> {
@NonNull
R apply(@NonNull P1 p1);
}
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public interface Function3<P1, P2, P3, R> {
@NonNull
R apply(@NonNull P1 p1, @Nullable P2 p2, @NonNull P3 p3);
}
Activity的封装
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewbinding.ViewBinding;
import com.gzq.base.base.function.Function1;
public abstract class BaseJavaActivity<T extends ViewBinding> extends AppCompatActivity {
protected T binding;
protected abstract @NonNull Function1<LayoutInflater, T> getBinding();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = getBinding().apply(getLayoutInflater());
setContentView(binding.getRoot());
}
}
Activity的使用
xml就不写了,ActivityUseJavaBinding是生成的代码。
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.gzq.android.databinding.ActivityUseJavaBinding;
import com.gzq.base.base.BaseJavaActivity;
import com.gzq.base.base.function.Function1;
public class UseJavaActivity extends BaseJavaActivity<ActivityUseJavaBinding> {
@NonNull
@Override
protected Function1<LayoutInflater, ActivityUseJavaBinding> getBinding() {
return ActivityUseJavaBinding::inflate;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding.tvText.setText("演示demo");
}
}
Fragment的封装
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.viewbinding.ViewBinding;
import com.gzq.base.base.function.Function3;
public abstract class BaseJavaFragment<T extends ViewBinding> extends Fragment {
protected T binding;
protected abstract @NonNull Function3<LayoutInflater, ViewGroup, Boolean, T> getBinding();
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = (T) getBinding().apply(inflater, container, false);
return binding.getRoot();
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}
Fragment的使用
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.gzq.android.databinding.FragmentUseJavaBinding;
import com.gzq.base.base.BaseJavaFragment;
import com.gzq.base.base.function.Function3;
public class UseJavaFragment extends BaseJavaFragment<FragmentUseJavaBinding> {
@NonNull
@Override
protected Function3<LayoutInflater, ViewGroup, Boolean, FragmentUseJavaBinding> getBinding() {
return FragmentUseJavaBinding::inflate;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.tvText.setText("演示demo");
}
}
使用Kotlin的封装
Activity的封装
import android.os.Bundle
import android.view.LayoutInflater
import androidx.appcompat.app.AppCompatActivity
import androidx.viewbinding.ViewBinding
abstract class BaseBindingActivity<VB : ViewBinding>(
val block: (LayoutInflater) -> VB
) : AppCompatActivity() {
private var _binding: VB? = null
protected val binding: VB
@JvmName("binding")
get() = requireNotNull(_binding) { "The property of binding has been destroyed." }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_binding = block(layoutInflater)
setContentView(binding.root)
}
override fun onDestroy() {
super.onDestroy()
_binding = null
}
}
Activity使用
import android.os.Bundle
import com.gzq.android.databinding.ActivityUseJavaBinding
import com.gzq.base.base.BaseBindingActivity
class UseKotlinActivity : BaseBindingActivity<ActivityUseJavaBinding>(ActivityUseJavaBinding::inflate) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.tvText.text="演示demo"
}
}
Fragment的封装
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.viewbinding.ViewBinding
abstract class BaseBindingFragment<VB : ViewBinding>(
val block: (LayoutInflater, ViewGroup?, Boolean) -> VB
) : Fragment() {
private var _binding: VB? = null
protected val binding: VB
@JvmName("binding")
get() = requireNotNull(_binding) { "The property of binding has been destroyed." }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = block(inflater, container, false)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding=null
}
}
Fragment的使用
import android.os.Bundle
import android.view.View
import com.gzq.android.databinding.FragmentUseJavaBinding
import com.gzq.base.base.BaseBindingFragment
class UseKotlinFragment : BaseBindingFragment<FragmentUseJavaBinding>(FragmentUseJavaBinding::inflate) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.tvText.text="演示demo"
}
}