SORU
18 HAZİRAN 2012, PAZARTESİ


Arka plan değiştirme drawable searchview widget

Android actionbar searchview widget oturur drawable değiştirmeye çalışıyorum.

Şu anda bu gibi görünüyor: enter image description here

ama mavi arka plan kırmızı bir renk drawable değiştirmem gerekiyor.

Birçok şeyi kendi arama widget rolling kısa denedim, ama hiçbir şey iş gibi görünüyor.

Birileri bunu değiştirmek için doğru yönde bana gelin miyim?

CEVAP
26 Temmuz 2012, PERŞEMBE


İntro

Ne yazık ki yolu SearchView metin alanı 49 ** olarak XML temalar, stilleri ve devralma kullanarak stilini ayarlamak için yok. Bu searchViewTextField oysa R.stylable, (ilgileniyoruz bu tema özniteliği) selectableItemBackground is listed as styleable olmasıdır. Böylece, XML kaynakları (No resource found that matches the given name: attr 'android:searchViewTextField' bir hata alırsınız) kolaylıkla içinde erişim.

Kod SearchView metin alanı arka plan ayarlama

Yani, tek yolu düzgün bir şekilde yerine arka plan SearchView metin alanına girmek değil iç, elde erişmek üzere olan arka plan tabanlı set searchViewTextField ve set bizim.

NOT:Çözüm aşağıda bağlıdır sadece kimliği (android:id/search_plate) öğesi içinde SearchView, o yüzden daha fazla SDK sürüm bağımsız daha çocuk geçişi (örneğin kullanarak searchView.getChildAt(0) almak için doğru görünümü içinde SearchView), ama değil kurşun geçirmez. Özellikle bazı üretici SearchView ve yukarıda belirtilen elemanın yeniden gerçeklemek iç verirse ıd şifre işe yaramaz mevcut değildir.

SDK, SearchView metin alanı arka plan aynı şekilde yapacağız nine-patches ile ilan edilir. Orijinal bulabilirsinizpngAndroid git repository drawable-mdpi dizin görüntüler. İki resim ilgileniyoruz. (textfield_search_default_holo_light.9.png adında) olmadığı için metin alanı seçildiğinde devlet için bir (textfield_search_selected_holo_light.9.png olarak adlandırılır) ve bir.

Ne yazık ki, sadece özelleştirmek isterseniz bile görüntüleri yerel bir kopyasını oluşturunduruldudevlet. Bu textfield_search_default_holo_light R.drawable yok çünkü. Böylece seçici aşağıda gösterilen kullanılabilecek @android:drawable/textfield_search_default_holo_light ile kolayca erişilebilir, yerel drawable başvurma yerine değil.

NOT:KullanıyordumHolo Işıktemel olarak bir tema, ama aynı şeyi yapabilirsinizHolo Karanlık. İçinde gerçek bir fark yok gibi görünüyorseçilen devlet9-lekeler Light 58* temalar arasında. Ancak, 9-yamalar bir fark vardevlet varsayılan(Light vs ** 60). Yani, muhtemelen 9-yamalar yerel kopyalarını yapmak için gerek yokseçilen devlether ikisi için deKaranlıkveIşıktemalar (her ikisi de işleyeceğini varsayarak, ve onlara göz de aynıHolo Tema). Sadece bir yerel kopyasını alın ve kullanınseçici drawableher iki konu için.

Şimdi, size ihtiyacı dokuz yamalar (yani kırmızı bir mavi renk değiştirme) indirilen düzenlemeniz gerekir. Eğer düzenledikten sonra doğru tanımlanırsa dosyasını kontrol etmek için draw 9-patch tool kullanarak bir göz atın.

Dosyaları bir piksel kalem aracı (çok kolay) GIMP kullanarak düzelttim ama siz kendi aracını kullanacağız. İşte benim için 9-yama özelleştirilmişodaklı devlet:

enter image description here

NOT:Basitlik için, tek resim kullandımmdpiyoğunluk. Oluşturmanız gerekir9-lekelerbirden fazla ekran yoğunluğu ise, herhangi bir cihaz üzerinde en iyi sonucu istiyorum. Görüntüler içinHoloSearchView mdpi, hdpi xhdpi drawable bulunabilir.

Şimdi, doğru görüntüyü durumuna göre görüntülenmesi drawable seçici oluşturmak istiyoruz. Dosya 22* *aşağıdaki içerik ile oluşturun:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true"
        android:drawable="@drawable/textfield_search_selected_holo_light" />
    <item android:drawable="@drawable/textfield_search_default_holo_light" />
</selector>

SearchView - kendi kimliği içinde android:id/search_plate yukarıda oluşturduğunuz metin alanı tutan LinearLayout görünümü için arka plan ayarlamak için drawable kullanacağız. Burada seçenekler menüsü oluştururken bu hızlı kod olarak mı, nasıl yani:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }       

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);

        // Getting SearchView from XML layout by id defined there - my_search_view in this case
        SearchView searchView = (SearchView) menu.findItem(R.id.my_search_view).getActionView();
        // Getting id for 'search_plate' - the id is part of generate R file,
        // so we have to get id on runtime.
        int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
        // Getting the 'search_plate' LinearLayout.
        View searchPlate = searchView.findViewById(searchPlateId);
        // Setting background of 'search_plate' to earlier defined drawable.            
        searchPlate.setBackgroundResource(R.drawable.textfield_searchview_holo_light);          

        return super.onCreateOptionsMenu(menu);
    }

}

Nihai etkisi

İşte sonuç ekran görüntüsü:

enter image description here

Nasıl bu hale getirdim

Bu yaklaşım diğer görünümleri özelleştirme ne zaman kullanılabilir böylece bu nasıl geldiğimi metioning değer bence.

Kontrol görünüm düzeni

SearchView düzen gibi görünüyor nasıl kontrol ettim. SearchView contructor düzen şişirir bir satır bulabilirsiniz:

inflater.inflate(R.layout.search_view, this, true);

Şimdi SearchView düzeni dosyası res/layout/search_view.xml adlı biliyoruz. search_view.xml içine içine android.widget.SearchView$SearchAutoComplete LinearLayout içsel bir öğe (kimliği search_plate) (bizim arama anlaşılan metin görüntüleme alanı) bulabiliriz:

    <LinearLayout
        android:id="@ id/search_plate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:orientation="horizontal"
        android:background="?android:attr/searchViewTextField">

Şimdi, biz arka plan searchViewTextField mevcut tema göre ayarlanmış şimdi bağlıyorlar.

Soruşturma özniteliği (kolayca ayarlanabilir.)

searchViewTextField öznitelik kümesi ne kadar kontrol etmek için, biz 68 ** araştırın. Öznitelikleri 39 ** varsayılan SearchView ile ilgili bir grup

<style name="Theme">
    <!-- (...other attributes present here...) -->

    <!-- SearchView attributes -->
    <item name="searchDropdownBackground">@android:drawable/spinner_dropdown_background</item>
    <item name="searchViewTextField">@drawable/textfield_searchview_holo_dark</item>
    <item name="searchViewTextFieldRight">@drawable/textfield_searchview_right_holo_dark</item>
    <item name="searchViewCloseIcon">@android:drawable/ic_clear</item>
    <item name="searchViewSearchIcon">@android:drawable/ic_search</item>
    <item name="searchViewGoIcon">@android:drawable/ic_go</item>
    <item name="searchViewVoiceIcon">@android:drawable/ic_voice_search</item>
    <item name="searchViewEditQuery">@android:drawable/ic_commit_search_api_holo_dark</item>
    <item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>

Tema için varsayılan değer @drawable/textfield_searchview_holo_dark olduğunu görüyoruz. Theme.Light değer is also set in that file için.

Şimdi, Eğer bu nitelik değil ama ne yazık ki R.styleable, erişilebilir olsaydı çok iyi olurdu. Karşılaştırma için, diğer bakıntemathemes.xml 72* hem mevcut olan nitelikler textAppearance selectableItemBackground gibi. searchViewTextField R.attr (R.stylable) mevcut ise XML tamamen uygulama için tema tanımlarken sadece drawable bizim seçici kullanabiliriz. Örneğin:

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="AppTheme" parent="android:Theme.Light">
        <item name="android:searchViewTextField">@drawable/textfield_searchview_holo_light</item>
    </style>
</resources>

Modifiye ne olmalıdır?

Şimdi kod ile search_plate erişim gerekecek. Ancak, biz hala gibi görünmelidir nasıl bilmiyorum. Kısacası, biz drawables temalar varsayılan değer olarak kullanılan ara: textfield_searchview_holo_dark.xml textfield_searchview_holo_light.xml. İçerik de bu drawable görüyor diğer iki drawables 9-lekeler daha sonra gerçekleşmesi) görünüm dayalı bir devlet olan selector. 9-yama androiddrawables.com (neredeyse) tüm Android sürümünden drawables toplanan bulabilirsiniz

Özelleştirme

Bu yerel kopyasını oluşturur ve renkleri istediğiniz gibi değiştirin one of the 9-patches mavi çizgiyi farkındayız.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Klemens Torggler

    Klemens Torg

    11 Mart 2008
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008
  • Videojug

    Videojug

    25 EKİM 2006