linearlayout - layout dinamico android
Hacer que LinearLayout actúe como un botón (8)
En la aplicación en la que estoy trabajando, necesito crear LinearLayout de forma dinámica. En este caso, el comando
ll.setClickable(true);
no está funcionando como se supone que debe hacer. Aunque puedo perder algo, logré explotar setOnTouchListener para obtener el mismo resultado y envié el código por si alguien tiene las mismas necesidades.
El siguiente código crea un LinearLayout con dos textviews y esquinas redondeadas, cambiando de color cuando se presiona.
En primer lugar, cree dos archivos xml en la carpeta dibujable, uno para el estado normal y otro para el estado del planchado lineal.
Estado normal xml (drawable / rounded_edges_normal.xml)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#FFFFFF" />
<corners android:radius="7dp" />
<padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip" />
</shape>
</item>
<item android:bottom="3px">
<shape android:shape="rectangle">
<solid android:color="#F1F1F1" />
<corners android:radius="7dp" />
</shape>
</item>
</layer-list>
Presionado xml de estado (drawable / rounded_edges_pressed.xml). La única diferencia está en el color ...
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#FFFFFF" />
<corners android:radius="7dp" />
<padding android:left="5dip" android:top="5dip" android:right="5dip" android:bottom="5dip" />
</shape>
</item>
<item android:bottom="3px">
<shape android:shape="rectangle">
<solid android:color="#add8e6" />
<corners android:radius="7dp" />
</shape>
</item>
</layer-list>
Entonces el siguiente código hace el trabajo
Variable global:
public int layoutpressed = -1;
En onCreate()
:
// Create some textviews to put into the linear layout...
TextView tv1 = new TextView(this);
TextView tv2 = new TextView(this);
tv1.setText("First Line");
tv2.setText("Second Line");
// LinearLayout definition and some layout properties...
final LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.VERTICAL);
// it is supposed that the linear layout will be in a table.
// if this is not the case for you change next line appropriately...
ll.setLayoutParams(new TableRow.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
ll.setBackgroundResource(R.drawable.rounded_edges_normal);
ll.addView(tv1);
ll.addView(tv2);
ll.setPadding(10, 10, 10, 10);
// Now define the three button cases
ll.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getAction()==MotionEvent.ACTION_DOWN){
ll.setBackgroundResource(R.drawable.rounded_edges_pressed);
ll.setPadding(10, 10, 10, 10);
layoutpressed = arg0.getId();
}
else if (arg1.getAction()== MotionEvent.ACTION_UP){
ll.setBackgroundResource(R.drawable.rounded_edges_normal);
ll.setPadding(10, 10, 10, 10);
if(layoutpressed == arg0.getId()){
// ...........................................................................
// Code to execute when LinearLayout is pressed...
// ...........................................................................
}
}
else{
ll.setBackgroundResource(R.drawable.rounded_edges_showtmimata);
ll.setPadding(10, 10, 10, 10);
layoutpressed = -1;
}
return true;
}
});
Tengo un LinearLayout que he diseñado para que parezca un botón, y contiene algunos elementos text / ImageView. Me gustaría hacer que todo LinearLayout actúe como un botón, en particular para darle estados que estén definidos de manera que tenga un fondo diferente cuando se presione.
¿Hay alguna manera mejor que hacer un ImageButton del tamaño de todo el diseño y posicionamiento absolutamente?
Las referencias anteriores trataban sobre cómo establecer el fondo predeterminado en el archivo xml. Aquí lo mismo en el código:
linearLayout1.setBackgroundResource(android.R.drawable.list_selector_background);
Me encontré con este problema ahora mismo. Tendrás que configurar LinearLayout para hacer clic. Puedes hacer esto en el XML con
android:clickable="true"
O en el código con
yourLinearLayout.setClickable(true);
¡Aclamaciones!
Primero, querrá un selector para definir los diferentes estados. Por ejemplo, en un archivo XML:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_pressed"
android:state_pressed="true" />
<item android:drawable="@drawable/button_focused"
android:state_focused="true" />
<item android:drawable="@drawable/button_normal" />
</selector>
No lo he intentado, pero posiblemente puedes configurar el fondo de Android de LinearLayout en este selector y configurar Android: hacer clic en verdadero y funcionará.
Si no lo hace, puede cambiar a usar un RelativeLayout, y hacer que el primer elemento sea un botón con este selector como fondo y fill_parent para su ancho y alto de diseño. En este caso, simplemente use un Botón regular y configure Android: fondo para su selector. No tiene que poner texto en su botón.
Si desea agregar el comportamiento de fondo predeterminado de Android para hacer que un Layout
actúe como una vista "clicable", establezca el Layout
específico:
API 11+ (Android puro):
android:background="?android:attr/selectableItemBackground"
API 7+ (Android + AppCompat Support Library):
android:background="?attr/selectableItemBackground"
Cualquier API:
android:background="@android:drawable/list_selector_background"
Las respuestas anteriores siguen siendo ciertas, pero no me ayudaron por solo agregar el estado predeterminado de UI presionado y liberado (como en un ListView
por ejemplo).
Simplemente agregue background attr / seleccionableItemBackground al diseño lineal y también haga que se pueda hacer clic en el diseño lineal.
ejemplo:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/linear1"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true">
Eso hace que linearlayout actúe como un botón cuando presiona. :)
Solo establece estos atributos
<LinearLayout
...
android:background="@android:drawable/btn_default"
android:clickable="true"
android:focusable="true"
android:onClick="onClick"
>
...
</LinearLayout>
Usé la primera y la segunda respuesta. Pero mi linearlayout tiene imágenes y texto con el color de fondo, así que tuve que cambiar "fondo" a "primer plano"
linearlayout
android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"