对于ViewBinding的封装

98 阅读1分钟

对于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"
    }
}