Uso detallado del método addView en Android ViewGroup

Reimpreso de: https://blog.csdn.net/qdjdeveloper/article/details/82794727

En el desarrollo diario, involucraremos muchas arquitecturas como MVC, MVP, MVVM, etc. Si nuestro proyecto en sí usa arquitectura MVP o MVVM, entonces la redundancia de código en Activity y Fragment puede ser relativamente pequeña, pero si la arquitectura de diseño del proyecto sí mismo Es MVC por lo que también podemos usar algunos otros métodos para descomponer la redundancia de código en nuestra Actividad y Fragmento. Sí, como dice el título, use el método addView en ViewGroup para lograr esto. A continuación, demostraremos cómo es. De hecho, es muy simple.

Aquí creamos un nuevo proyecto para demostrar que el nombre del proyecto es AddView. ! !

Tomemos una foto para ver lo que vamos a hacer:

 

Es la interfaz de arriba. Cuando la ve, piensa que es demasiado simple. No se preocupe y léala lentamente. Es relativamente simple aquí, pero es solo una demostración de ideas. Puede comprender el motivo. Implementémoslo.

Primero, creemos un código BaseCardView de la siguiente manera:

public abstract class BaseCardView {
    
    private Context mContext;
    private View mView;
    
    /**
     * 创建 card 不添加到 rootView 中
     *
     * @param root 需要添加的 rootView,不可以为空
     */

    public BaseCardView(Context context, @NonNull ViewGroup root) {
        this(context, root, false);
    }

    /**
     * 创建 card
     *
     * @param root 需要添加的 rootView,不可以为空
     * @param attachToRoot 是否添加到 rootView
     */
    public BaseCardView(Context context, @NonNull ViewGroup root, boolean attachToRoot) {
        mContext = context;
        createView(context, root, attachToRoot);
    }


    private void createView(Context context, ViewGroup root, boolean attachToRoot) {
        mView = LayoutInflater.from(context).inflate(onBindLayoutId(), root, attachToRoot);
        onViewCreated(mView);
    }
    
    protected abstract int onBindLayoutId();

    protected abstract void onViewCreated(View view);

    public View getView() {
        return mView;
    }
    
    protected Context getContext() {
        return mContext;
    }
}

A continuación implementaremos los 3 botones que vimos

El primero: HeaderCardView:

public class HeaderCardView extends BaseCardView {
    
    public HeaderCardView(Context context, @NonNull ViewGroup root) {
        super(context, root);
    }

    @Override
    protected int onBindLayoutId() {
        return R.layout.header_card_view;
    }

    @Override
    protected void onViewCreated(View view) {
    }
}

Al ver esto, todos deberían entender por qué debemos escribir una clase BaseCardView primero. Aquí nuestro HeaderCardView  hereda BaseCardView e implementa los métodos abstractos en BaseCardView

Publique el código header_card_view.xml, aquí lo escribimos relativamente simple, para explicar la verdad, de hecho, la interfaz compleja es la misma:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="HeaderView"
        android:textSize="20dp" />
</LinearLayout>

Entonces el código en MiddleCardView y FooterCardView es similar a esto, ya no pegue el código uno por uno, luego lo ensamblaremos en FirstActivity

El código de FirstActivity es el siguiente:

public class FirstActivity extends AppCompatActivity {
    
    //引入需要组装的 CardView
    private HeaderCardView headerCardView;
    private MiddleCardView middleCardView;
    private FooterCardView footerCardView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    /**
     * 初始化 View
     */
    private void initView() {
        LinearLayout mContainer = findViewById(R.id.ll_container);
        addView(mContainer);
    }

    /**
     * 添加 View
     * @param mContainer
     */

    private void addView(LinearLayout mContainer) {
        addHerderCardView(mContainer);
        addMiddleCardView(mContainer);
        addFooterCardView(mContainer);
    }

    /**
     * 添加 HerderCardView
     * @param mContainer
     */
    private void addHerderCardView(LinearLayout mContainer) {
        if (headerCardView == null) {
            headerCardView = new HeaderCardView(this, mContainer);
            headerCardView.initViewWithData("你好");
            mContainer.addView(headerCardView.getView());
        }
    }
    
    /**
     * 添加 MiddleCardView
     * @param mContainer
     */
    private void addMiddleCardView(LinearLayout mContainer) {
        if (middleCardView == null) {
            middleCardView = new MiddleCardView(this, mContainer);
            mContainer.addView(middleCardView.getView());
        }
    }
    
    /**
     * 添加 FooterCardView
     * @param mContainer
     */
    private void addFooterCardView(LinearLayout mContainer) {
        if (footerCardView == null) {
            footerCardView = new FooterCardView(this, mContainer);
            mContainer.addView(footerCardView.getView());
        }
    }
}

El código correspondiente en activity_first es el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".FirstActivity">

    <LinearLayout
        android:id="@+id/ll_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" />

</LinearLayout>

Creo que todos aquí deberían entender nuestra idea de realización. Si la interfaz es más complicada, podemos tomar prestada esta idea para realizarla. Refinar una interfaz y realizarla a través de pequeños módulos para lograr la reutilización y mantenibilidad del código.

La entrada de datos, veamos cómo los datos entrantes:

Aquí todavía usamos HeaderCardView para demostrar:

public class HeaderCardView extends BaseCardView {
    
    private Button btn;

    public HeaderCardView(Context context, @NonNull ViewGroup root) {
        super(context, root);
    }
    
    @Override
    protected int onBindLayoutId() {
        return R.layout.header_card_view;
    }

    @Override
    protected void onViewCreated(View view) {
        btn = view.findViewById(R.id.btn);
    }

    public void initViewWithData(String data) {
        btn.setText(data);
    }
}

Como puede ver, en realidad es relativamente simple. Definimos la función initViewWithData () para pasar datos. Aquí simplemente pasamos una cadena Sring. Puede pasar el valor específico de acuerdo con las necesidades reales del proyecto. A continuación, solo necesitamos para simplemente pasar el valor correspondiente en la clase que llama a HeaderCardView. Por ejemplo, demostremos en FirstActivity:

public class FirstActivity extends AppCompatActivity {
    
    private HeaderCardView headerCardView;
    private MiddleCardView middleCardView;
    private FooterCardView footerCardView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }
    
    private void initView() {
        LinearLayout mContainer = findViewById(R.id.ll_container);
        addView(mContainer);
    }
    
    private void addView(LinearLayout mContainer) {
        addHerderCardView(mContainer);
        addMiddleCardView(mContainer);
        addFooterCardView(mContainer);
    }

    private void addHerderCardView(LinearLayout mContainer) {
        if (headerCardView == null) {
            headerCardView = new HeaderCardView(this, mContainer);
            headerCardView.initViewWithData("你好");
            mContainer.addView(headerCardView.getView());
        }
    }
    
    private void addMiddleCardView(LinearLayout mContainer) {
        if (middleCardView == null) {
            middleCardView = new MiddleCardView(this, mContainer);
            mContainer.addView(middleCardView.getView());
        }
    }
    
    private void addFooterCardView(LinearLayout mContainer) {
        if (footerCardView == null) {
            footerCardView = new FooterCardView(this, mContainer);
            mContainer.addView(footerCardView.getView());
        }
    }
}

El procedimiento de ejecución es el siguiente:

 

       Puedes ver que se ha mostrado el valor que establecimos. Por ejemplo, si usamos un determinado módulo en ambas interfaces en nuestro desarrollo diario, ¿es fácil para nosotros implementarlo? Simplemente cargue nuestro CardView en la posición correspondiente usando addView. Bueno , aunque el ejemplo aquí es relativamente simple, proporciona una idea para simplificar la interfaz compleja. Si encuentra una interfaz más compleja durante el desarrollo, puede tomar prestada esta idea para dividirla y lograr capacidad de mantenimiento y reutilización. Hablando de reutilización, veamos la conveniencia de la reutilización. Aquí creamos SecondActivity de la siguiente manera:

public class SecondActivity extends AppCompatActivity {

    private HeaderCardView headerCardView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        initView();
    }

    private void initView() {
        LinearLayout mContainer = findViewById(R.id.ll_container);
        addView(mContainer);
    }

    private void addView(LinearLayout mContainer) {
        addHerderCardView(mContainer);
    }
    
    private void addHerderCardView(LinearLayout mContainer) {
        if (headerCardView == null) {
            headerCardView = new HeaderCardView(this, mContainer);
            mContainer.addView(headerCardView.getView());
        }
    }
}

Aquí reutilizamos el HeaderCardView. ¿Es muy conveniente? Compártelo aquí hoy

Supongo que te gusta

Origin blog.csdn.net/qq_37381177/article/details/111592575
Recomendado
Clasificación