LinearLayout'u bir Düğme gibi hareket ettirme


100

A LinearLayoutgibi görünmesi için biçimlendirdiğim bir a sahibim buttonve birkaç metin / ImageView öğesi içeriyor. Bütünün LinearLayoutbir a gibi hareket etmesini istiyorum button, özellikle de a ile tanımlanan durumları vermek, böylece basıldığında farklı bir arka plana sahip olsun.

ImageButtonTüm Düzenin boyutunu yapmaktan ve mutlak olarak konumlandırmaktan daha iyi bir yol var mı ?


Birinin baskıda (bir Düğme gibi) bir TableRow'u (bir LinearLayout'tan miras alınan) vurgulamanın bir yolunu araması durumunda, stackoverflow.com/a/8204768/427545
Lekensteyn

1
Biri tam çözüm almak isterse, şu depoyu kontrol edin: github.com/shamanland/AndroidLayoutSelectorLinearLayout a gibi özel tıklanabilir / kontrol edilebilirToggleButton
Oleksii K.

Yanıtlar:


154

Bu problemle şimdi karşılaştım. LinearLayout'u tıklanabilir olarak ayarlamanız gerekir. Bunu XML içinde şu şekilde yapabilirsiniz:

android:clickable="true"

Veya kodda

yourLinearLayout.setClickable(true);

Şerefe!


2
Aşağıdaki cevap çok daha iyi!
Zach Sperske

2
Ayrıca, alt öğesi olarak "tıklanabilir" bir öğeniz varsa, android:clickable="false"tıklama olaylarını engellemesini önlemek için ona eklemeyi unutmayın .
TheKalpit

gerekli değil, bir tıklama dinleyicisi eklemek benim için yeterliydi ve bir tıklama dinleyicisi istemiyorsanız neden bir şeyin tıklanabilir olmasını istersiniz?
hmac

158

Bir Layouteylemi "beğenilebilir" gibi yapmak için Android varsayılan arka plan davranışını eklemek istiyorsanız View, hedeflenen üzerinde ayarlayın Layout:

API 11+ (Saf Android):

android:background="?android:attr/selectableItemBackground"

API 7+ (Android + AppCompat Destek Kitaplığı):

android:background="?attr/selectableItemBackground"

Herhangi bir API:

android:background="@android:drawable/list_selector_background"

Yukarıdaki cevaplar hala doğrudur, ancak yalnızca varsayılan olarak basılmış ve serbest bırakılmış UI durumunu eklememe yardımcı olmadı (örneğin bir ListViewörnekte olduğu gibi).


Sizin için +1, bu, UI dokunma geri bildirimini istiyorsanız, ancak tıklama mantığını kendiniz halletmek istiyorsanız (ve bir onClickX yöntemi belirlemek zorunda kalmadan, android: tıklanabilirin gerektirdiği şey) harika
Rick Barkhouse,

2
Bu aynı zamanda malzeme tasarım dalgaları ile de çalışır. En iyi cevap.
Miro Markaravanes

3
İyi! Basıldığında, baskı efekti olarak turuncu / sarı gibi bir renk çıkar. Rengi yeşile çevirmek istiyorum. Nasıl yapılır?
Han Whiteking

@HanWhiteking öğrendin mi?
Jacob Sánchez

16

Birinci ve ikinci cevabı kullandım. Ancak doğrusal düzenimde arka plan renkli resimler ve metin var, bu yüzden "arka planı" "ön plan" olarak değiştirmek zorunda kaldım

doğrusal düzen

android:foreground="?android:attr/selectableItemBackground"
android:clickable="true"

9

Öncelikle, farklı durumları tanımlamak için bir seçici isteyeceksiniz. Örneğin, bir XML dosyasında:

<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>

Henüz denemedim, ancak LinearLayout'un android: arka planını bu seçiciye ayarlayabilir ve android: tıklanabilir ayarını true olarak ayarlayabilirsiniz ve çalışacaktır.

Aksi takdirde, RelativeLayout kullanmaya geçebilir ve ilk öğeyi arka plan olarak bu seçiciyle ve düzen genişliği ve yüksekliği için fill_parent ile bir düğme yapabilirsiniz. Bu durumda, normal bir Button kullanın ve android: background'ı seçicinize ayarlayın. Düğmenize metin koymak zorunda değilsiniz.


Evet, gerçek kullanmak için oy veriyorum Button. İhtiyacınız onDraw(Canvas)olan özel şeyleri yapmak için geçersiz kılabilirsiniz (örneğin, düğme içine resim veya metin çizin).
Dave

1
Teşekkürler! LinearLayout'un arka planını ayarlamak çalışır ve neredeyse dokunma olaylarına yanıt verir - Doğrusal Düzene doğrudan basarsam durumu güncellenir. İçindeki TextView'a basarsam, dokunma olayı onu LinearLayout'a uymuyor gibi görünüyor. Layout hit-testinin nasıl yapılacağına dair bir fikriniz var mı?
Jason Prado

TextView'da android: clickable = "false" deneyin. Bunu denemedim, ancak Metin Görünümlerine tıklamakla ilgili bir sorun yaşamadım. Belki de TextView'unuzun bir arka planı olduğu içindir.
Tenfour04

Bu, tıklama sesini çıkarmasa da hile yaptı. Bunu yapmanın bir yolu var mı?
Steven

@Steven Az önce eski yorumunuzu gördüm, üzgünüm. Sanırım tıklama sesi bir onClickListener atanmış olmasına bağlı. Bir onTouchListener ile bir şeyim vardı ve bir onClickListener (boş bir onClick yöntemiyle) ekleyene kadar tıklamazdı.
Tenfour04

7

Çalıştığım uygulamada dinamik olarak bir LinearLayout oluşturmam gerekiyor. Bu durumda komut

ll.setClickable(true);

olması gerektiği gibi çalışmıyor. Bir şeyleri gözden kaçırsam da, setOnTouchListener'ı kullanarak aynı sonucu elde etmeyi başardım ve herkesin aynı ihtiyaçları olması durumunda kodu gönderiyorum.

Aşağıdaki kod, iki metin görünümüne ve yuvarlak köşelere sahip bir LinearLayout oluşturur ve basıldığında rengi değiştirir.

İlk olarak, biri normal diğeri basılı doğrusal düzen durumu için olmak üzere, çekilebilir klasörde iki xml dosyası oluşturun.

Normal durum xml (çekilebilir / 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>

Basılmış durum xml (drawable / rounded_edges_pressed.xml). Tek fark renkte ...

<?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>

Ardından aşağıdaki kod işi yapar

Küresel değişken:

public int layoutpressed = -1;

İçinde 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;
                }
  });           

6

Sadece bu özellikleri ayarlayın

<LinearLayout 
    ...
    android:background="@android:drawable/btn_default" 
    android:clickable="true"
    android:focusable="true"
    android:onClick="onClick"
    >
...
</LinearLayout>

5

Doğrusal düzene arka plan attr / selectableItemBackground ekleyin ve ayrıca bu doğrusal düzeni tıklanabilir yapın

misal :

<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">

Bu, doğrusal düzene basıldığında düğme gibi davranır. :)


1

Bu yardımcı oldu, ancak bir arka plan rengi koymak ve doğrusal düzeni liste öğesi gibi tıklanabilir hale getirmek istiyorsanız. Arka planı tercih ettiğiniz renge ayarlayın ve ön plan rengini? Android: attr / selectableItemBackground, odaklanabilir doğru ve tıklanabilir doğru olarak ayarlayın

basit kod

   <LinearLayout

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:background="#FF0"
        android:orientation="horizontal"
        android:paddingBottom="10dp"
         android:paddingTop="10dp"
        android:onClick="onClickMethod"
        android:clickable="true"
        android:focusable="true"
        android:foreground="?android:attr/selectableItemBackground"
        />

0

Önceki sorular, xml dosyasında varsayılan arka planın nasıl ayarlanacağı hakkındaydı. İşte kodda aynı şey:

linearLayout1.setBackgroundResource(android.R.drawable.list_selector_background);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.