Conceptos básicos de Android: problemas encontrados en el desarrollo

1. Controla dinámicamente la posición del diseño

Durante el desarrollo, es posible que necesitemos cambiar la posición del diseño en diferentes interfaces en la misma actividad para que el diseño esté en una posición más razonable.

P.ej: Queremos que los usuarios tengan una experiencia inmersiva en la interfaz principal del evento, por eso ampliamos nuestro diseño a la barra del sistema, pero cuando cambiamos a la interfaz de configuración (fragmento), es muy probable que suceda Icono, la situación en la que algunos botones de la barra de título de nuestra interfaz están bloqueados. Para resolver este problema, tenemos que controlar la posición del diseño en el código.

Visualización de código:

FrameLayout.LayoutParams layoutParams;
layoutParams=(FrameLayout.LayoutParams) view.findViewById(R.id.choose_layout).getLayoutParams();
if(getActivity() instanceof WeatherActivity){
    
    
    //动态控制布局的margin属性
    layoutParams.topMargin=50;
}

2. El uso de botones de opción

Durante el desarrollo, a los usuarios a menudo se les pide que elijan si habilitar o deshabilitar una determinada función. En este momento, se necesita un control más hermoso para realizar esta función.

Pantalla de efectos:

Pantalla de código:

//声明依赖
dependencies {
    
    
    implementation 'com.github.zcweng:switch-button:0.0.3'
}
//布局文件中用法
<com.suke.widget.SwitchButton
    android:id="@+id/switch_button"
    android:layout_gravity="center"
    android:layout_marginLeft="60dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
//逻辑文件中用法
switchButton.setChecked();//设置控件的开关状态
switchButton.setOnCheckedChangeListener(new SwitchButton.OnCheckedChangeListener() {
    
    
    @Override
    public void onCheckedChanged(SwitchButton view, boolean isChecked) {
    
    //点击事件
        if(isChecked==true){
    
    
            //当控件变为true时的逻辑代码
        }else if(isChecked==false){
    
    
            //当控件变为false时的逻辑代码
        }
    }
});

3. Muestre el diseño solo cuando sea necesario

Durante el desarrollo, es posible que primero necesitemos ocultar parte del diseño y luego mostrar esta parte del diseño cuando el usuario realiza una operación. Para lograr esta función, le presentaré dos métodos y señalaré sus pros y contras.

3.1 Controlar los atributos visibles del diseño

Primero debemos establecer la propiedad visible del diseño oculto en View.GONE, y luego establecer la propiedad visible en View.VISIBLE después de que el usuario realice una operación para lograr fácilmente esta función.

3.2ViewStub

También podemos usar el control ViewStub para ayudarnos a lograr esta función.

Visualización de código:

//待隐藏布局
<?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="match_parent"
    android:orientation="vertical" >
 
    <EditText
        android:id="@+id/edit_extra1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:hint="Extra field 1" />
 
    <EditText
        android:id="@+id/edit_extra2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="10dp"
        android:hint="Extra field 2" />
 
    <EditText
        android:id="@+id/edit_extra3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="10dp"
        android:hint="Extra field 3" />
 
</LinearLayout>
//主界面布局
<?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="match_parent"
    android:orientation="vertical" >
 
    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="10dp"
        android:hint="@string/edit_something_here" />
 
    <Button
        android:id="@+id/more"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="10dp"
        android:text="More" />
    
    <ViewStub 
        android:id="@+id/view_stub"
        android:layout="@layout/profile_extra"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
 
</LinearLayout>
//逻辑代码
private EditText editExtra1;
private EditText editExtra2;
private EditText editExtra3;

public void onMoreClick() {
    
    //当我们点击more按钮时执行该函数,即可是实现隐藏布局的显示
	ViewStub viewStub = (ViewStub) findViewById(R.id.view_stub);
	if (viewStub != null) {
    
    
		View inflatedView = viewStub.inflate();
		editExtra1 = (EditText) inflatedView.findViewById(R.id.edit_extra1);
		editExtra2 = (EditText) inflatedView.findViewById(R.id.edit_extra2);
		editExtra3 = (EditText) inflatedView.findViewById(R.id.edit_extra3);
	}

3.3 Pros y contras de los dos métodos anteriores

el primer método:

  • Ventajas: lógica simple y control flexible.

  • Desventaja: consumir recursos. Aunque la vista es inicialmente visible View.GONE, la Vista seguirá siendo Inflar cuando se distribuya Inflate, lo que significa que el objeto aún se creará, se instanciará y se establecerán los atributos. En otras palabras, se consumirán recursos como la memoria.

El segundo método:

  • Ventajas: cuando se diseña Inflate, solo se inicializará ViewStub, y luego, cuando se configure ViewStub para que sea visible, o cuando se llame a ViewStub.inflate (), se inflará y se creará una instancia del diseño al que se dirige ViewStub, y luego Las propiedades de diseño de ViewStub se pasarán al diseño al que apunta. De esta manera, puede usar ViewStub para mostrar cómodamente un diseño en tiempo de ejecución. Esto ahorra recursos de memoria y se da cuenta de la optimización del diseño.

  • Características: ViewStub solo se puede inflar una vez, y luego el objeto ViewStub se establecerá en nulo. En otras palabras, después de que un diseño especificado por ViewStub se infle, ViewStub ya no puede controlarlo; ViewStub solo se puede usar para inflar un archivo de diseño, no una vista específica. Por supuesto, también puede escribir Ver en En un archivo de diseño.

  • Desventajas: Durante la ejecución del programa, un determinado diseño no cambiará después de Inflar, a menos que se reinicie. En otras palabras, el diseño cargado ya no se puede ocultar; solo el archivo de diseño, no una Vista, se puede controlar para mostrar y ocultar.

4. Determine qué imagen muestra ImageView

Durante el desarrollo, podemos decidir qué evento de clic ejecutar en función de la imagen que muestra ImageView. Para lograr esta función, debe determinar qué imagen muestra ImageView primero.

Visualización de código:

moreImage.setOnClickListener(new View.OnClickListener() {
    
    
    @Override
    public void onClick(View view) {
    
    
        if(moreImage.getDrawable().getCurrent().getConstantState().equals(ContextCompat.getDrawable(SettingActivity.this,R.drawable.many).getConstantState())){
    
    //判断方法
            //具体逻辑
        }else {
    
    
            //具体逻辑
        }
    }
});

5. El uso de botones de opción

Durante el desarrollo, a veces necesitamos proporcionar un conjunto de opciones para que los usuarios elijan una. Para lograr esta función, debe usar el control del botón de radio.

Visualización de código:

//布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <RadioGroup
        android:id="@+id/radio_group"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <RadioButton
            android:id="@+id/eight_time"
            android:layout_margin="10dp"
            android:text="8小时"
            android:textSize="20sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/four_time"
            android:layout_margin="10dp"
            android:text="4小时"
            android:textSize="20sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/two_time"
            android:layout_margin="10dp"
            android:text="2小时"
            android:textSize="20sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/one_time"
            android:layout_margin="10dp"
            android:text="1小时"
            android:textSize="20sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </RadioGroup>

</LinearLayout>
//逻辑代码
radioGroup.check();//设置哪一单选框为选中状态
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    
    //点击事件
    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int i) {
    
    
        switch (i){
    
    
            case R.id.eight_time:
                //选中后的逻辑代码
                break;
            case R.id.four_time:
                //选中后的逻辑代码
                break;
            case R.id.two_time:
                 //选中后的逻辑代码
                break;
            case R.id.one_time:
                 //选中后的逻辑代码
                break;
            default:
        }
    }
}

6.RecyclerView implementa la eliminación deslizante

En el desarrollo, a veces necesitamos implementar un determinado diseño de subelementos del RecyclerView de deslizamiento lateral para eliminar su función.

El método de implementación básico de RecyclerView se omite en el siguiente código. Si los lectores no lo tienen claro, muévase aquí

Visualización de código:

//为RecycleView绑定触摸事件
ItemTouchHelper helper=new ItemTouchHelper(new ItemTouchHelper.Callback() {
    
    

    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
    
    
    	//首先回调的方法 返回int表示是否监听该方向
        int dragFlags = ItemTouchHelper.UP|ItemTouchHelper.DOWN;//拖拽
        int swipeFlags = ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;//侧滑删除
        return makeMovementFlags(dragFlags,swipeFlags);
    }
    
    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
    
    
    	//滑动事件
        return false;
    }
    
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
    
    
    	//侧滑事件
        nameList.remove(viewHolder.getAdapterPosition());
        myAdapter.notifyItemRemoved(viewHolder.getAdapterPosition());
    }
    
});
helper.attachToRecyclerView(recyclerView);

Nota: Si aún necesita eliminar el contenido de la base de datos en el evento de deslizamiento lateral, colóquelo antes de la función de eliminación; de lo contrario, el valor de retorno de getAdapterPosition () cambiará.

7. Maneje el evento click de RecyclerView en la actividad.

Cuando se trata del evento click de RecyclerView, es muy probable que se usen algunos datos de la actividad. En general, el evento click de RecyclerView se registra en su adaptador, lo que hace que no puedas implementar algo en el evento click. Algunas funciones. Para resolver el problema del manejo de eventos de clic en actividades, podemos usar la interfaz de devolución de llamada para lograrlo.

Visualización de código:

//定义接口
public interface OnItemClickListener {
    
    
    void onItemClick(int position);
}
//在适配器的点击事件中调用该接口中的方法
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    
    

    private List<Saved> list=new ArrayList<>();
    private OnItemClickListener Listener=null;
    
    public MyAdapter(List<Saved> list, OnItemClickListener Listener){
    
    //我们还需要在构造方法传入该接口
        this.Listener=Listener;
        this.list=list;
    }
    
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, final int viewType) {
    
    
        View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item,parent,false);
        final ViewHolder viewHolder=new ViewHolder(view);
        view.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View view) {
    
    
                Listener.onItemClick(viewHolder.getAdapterPosition());//调用接口中的方法
            }
        });
        return viewHolder;
    }

	......
}
//在活动中实现该接口中的方法
OnItemClickListener recyclerListener=new OnItemClickListener() {
    
    
    @Override
    public void onItemClick(int position) {
    
    
        //具体逻辑代码
    }
};

Supongo que te gusta

Origin blog.csdn.net/ABded/article/details/109148100
Recomendado
Clasificación