ActionBar'da özel görünüm nasıl görüntülenir?


93

İşlem çubuğunda özel aramayı görüntülemek istiyorum (bunun için ActionBarSherlock kullanıyorum).

Anladım:

görüntü açıklamasını buraya girin

Ancak mevcut genişliğin tamamını kaplamak için özel düzen (edittext alanı) yapmak istiyorum.

Burada önerildiği gibi özel düzen uyguladım .

Benim özel düzenim var search.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="?attr/actionButtonStyle"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:layout_gravity="fill_horizontal"
    android:focusable="true" >

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|fill_horizontal" >

        <EditText
            android:id="@+id/search_query"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center"
            android:background="@drawable/bg_search_edit_text"
            android:imeOptions="actionSearch"
            android:inputType="text" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right|center_vertical"
            android:src="@drawable/ic_search_arrow" />

    </FrameLayout>

</LinearLayout>

Ve içinde MyActivity:

ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setIcon(R.drawable.ic_action_search);

LayoutInflater inflator = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflator.inflate(R.layout.search, null);

actionBar.setCustomView(v);

Tüm mevcut genişliği kaplayacak özel düzeni nasıl yapabilirim actionBar?

Yardım lütfen.


Başlığı özel görünüm setiyle ayarlayabiliyor musunuz?
Roy Lee

Yanıtlar:


95

Bunun için bir numara var. Tek yapmanız gereken , ana konteyner RelativeLayoutyerine kullanmaktır LinearLayout. Bunun için android:layout_gravity="fill_horizontal"ayarlanmış olması önemli . Bunu yapmalı.


3
@Tomik Senaryoma bir bakar mısınız? stackoverflow.com/questions/16516306/… Özel görünüm ayarlandıktan sonra başlığım eksik.
Roy Lee

36

Bununla kendim mücadele ettim ve Tomik'in cevabını denedim. Ancak bu, düzeni yalnızca görünüme bir şey eklediğinizde başlangıçta tam kullanılabilir genişliğe getirmedi.

LayoutParams.FILL_PARENTGörünümü eklerken ayarlamanız gerekecek :

//I'm using actionbarsherlock, but it's the same.
LayoutParams layout = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
getSupportActionBar().setCustomView(overlay, layout); 

Bu şekilde mevcut alanı tamamen doldurur. (Tomik'in çözümünü de kullanmanız gerekebilir).


2
+1, aslında, yalnızca LayoutParams, thnx
Mahmoud

1
kaplama değeri nedir?
androidevil

2
@androider sizin özel görünümünüzdür. Ya xml'den şişirilmiş ya da kodda oluşturulmuş.
Bilthon

9

Benim için bu şekilde çalıştı (yukarıdaki cevaplardan hem varsayılan başlığı hem de özel görünümümü gösteriyordu).

ActionBar.LayoutParams layout = new ActionBar.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
// actionBar.setCustomView(view); //last view item must set to android:layout_alignParentRight="true" if few views are there 
actionBar.setCustomView(view, layout); // layout param width=fill/match parent
actionBar.setDisplayShowCustomEnabled(true);//must other wise its not showing custom view.

Ne fark olduğunu hem setCustomView(view)ve setCustomView(view,params)görünümü width = maçı / dolgu ebeveyn. setDisplayShowCustomEnabled (boolean showCustom)


İkinci parametrenin değeri olarak MATCH_PARENT'i WRAP_CONTENT olarak değiştirmek hile yaptı. LinearLayout Kullanılıyor ...
ka3ak

6

Tomik ve Peterdk'ın yanıtları, özel görünümünüzün tüm eylem çubuğunu kaplamasını , hatta yerel başlığı gizlemesini istediğinizde işe yarar .

Ancak, özel görünümünüzün başlıkla yan yana yaşamasını (ve başlık görüntülendikten sonra kalan tüm alanı doldurmasını) istiyorsanız, size burada Android-Developer kullanıcısının mükemmel cevabına başvurabilir miyim:

https://stackoverflow.com/a/16517395/614880

En alttaki kodu benim için mükemmel çalıştı.


3

Örneğin, bir EditText öğesi içeren bir yerleşim dosyası tanımlayabilirsiniz.

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/searchfield"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:inputType="textFilter" >

</EditText> 

yapabilirsin

public class MainActivity extends Activity {

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

    ActionBar actionBar = getActionBar();
    // add the custom view to the action bar
    actionBar.setCustomView(R.layout.actionbar_view);
    EditText search = (EditText) actionBar.getCustomView().findViewById(R.id.searchfield);
    search.setOnEditorActionListener(new OnEditorActionListener() {

      @Override
      public boolean onEditorAction(TextView v, int actionId,
          KeyEvent event) {
        Toast.makeText(MainActivity.this, "Search triggered",
            Toast.LENGTH_LONG).show();
        return false;
      }
    });
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM
        | ActionBar.DISPLAY_SHOW_HOME);


    }

saatimi kurtardım .. Teşekkürler
CrazyMind

1

Android'in başlatıcı uygulamasında bir örnek var (buradan bir kitaplık oluşturdum), duvar kağıtlarını seçen sınıfın içinde ("WallpaperPickerActivity").

Örnek, bunun çalışması için özelleştirilmiş bir tema ayarlamanız gerektiğini gösterir. Ne yazık ki, bu benim için yalnızca normal çerçeveyi kullanarak çalıştı ve destek kitaplığından birini kullanmadı.

İşte temalar:

styles.xml

 <style name="Theme.WallpaperPicker" parent="Theme.WallpaperCropper">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowShowWallpaper">true</item>
  </style>

  <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault">
    <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowActionBarOverlay">true</item>
  </style>

  <style name="WallpaperCropperActionBar" parent="@android:style/Widget.DeviceDefault.ActionBar">
    <item name="android:displayOptions">showCustom</item>
    <item name="android:background">#88000000</item>
  </style>

value-v19 / styles.xml

 <style name="Theme.WallpaperCropper" parent="@android:style/Theme.DeviceDefault">
    <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowActionBarOverlay">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
  </style>

  <style name="Theme" parent="@android:style/Theme.DeviceDefault.Wallpaper.NoTitleBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
  </style>

DÜZENLEME: Bunu yapmanın daha iyi bir yolu var, bu da destek kitaplığında çalışıyor. Yukarıda yazdıklarım yerine bu kod satırını eklemeniz yeterli:

getSupportActionBar().setDisplayShowCustomEnabled(true);
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.