Jak wyświetlić własny widok na pasku akcji?
Chcę wyświetlić własne wyszukiwanie w pasku actionbar (używam do tego ActionBarSherlock).
Mam to:
Ale chcę, aby układ niestandardowy (pole edittext) zajmował całą dostępną szerokość.
Zaimplementowałem własny layout zgodnie z sugestią tutaj .
Jest mój Niestandardowy layout 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>
I w 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);
Jak zrobić niestandardowy układ, aby zajmował całą dostępną Szerokość actionBar
?
Pomoc, proszę.
6 answers
Jest na to sztuczka. Wszystko, co musisz zrobić, to użyć RelativeLayout
zamiast LinearLayout
jako głównego kontenera. Ważne jest, aby android:layout_gravity="fill_horizontal"
było ustawione. To powinno wystarczyć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-14 16:41:05
Sam się z tym zmagałem i spróbowałem odpowiedzi Tomika. Jednak to nie sprawiło, że układ był w pełni dostępny na początku, tylko po dodaniu czegoś do widoku.
Musisz ustawić LayoutParams.FILL_PARENT
Podczas dodawania widoku:
//I'm using actionbarsherlock, but it's the same.
LayoutParams layout = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
getSupportActionBar().setCustomView(overlay, layout);
W ten sposób całkowicie wypełnia dostępną przestrzeń. (Konieczne może być również użycie roztworu Tomika).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-20 15:05:32
Odpowiedzi z Tomika i Peterdka działają, gdy chcesz, aby Twój niestandardowy widok zajmował cały pasek akcji, nawet ukrywając natywny tytuł.
Ale jeśli chcesz, aby Twój niestandardowy widok działał obok tytułu (i wypełniał całą pozostałą przestrzeń po wyświetleniu tytułu), mogę skierować cię do doskonałej odpowiedzi od dewelopera Androida tutaj:
Https://stackoverflow.com/a/16517395/614880
Jego kod na dole zadziałał idealnie dla mnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:19
Tak to działało dla mnie(z powyższych odpowiedzi pokazywał zarówno domyślny tytuł, jak i mój niestandardowy widok).
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.
Zauważyłem, że zarówno setCustomView(view)
jak i setCustomView(view,params)
widok width=dopasuj/wypełnij rodzic. setDisplayShowCustomEnabled (boolean showCustom)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 09:14:14
Na przykład można zdefiniować plik układu, który zawiera element EditText.
<?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>
You can do
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);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-03 07:47:31
Jest przykład w aplikacji uruchamiającej na Androida (że zrobiłem z niej bibliotekę, tutaj), wewnątrz klasy, która obsługuje zbieranie tapet ("WallpaperPickerActivity").
Przykład pokazuje, że musisz ustawić niestandardowy motyw, aby to działało. Niestety, to działało dla mnie tylko przy użyciu normalnego frameworka, a nie jednej z biblioteki wsparcia.
Oto Tematy:
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>
Wartość-v19 / style.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>
EDIT: istnieje lepszy sposób, aby to zrobić, który działa również na bibliotece wsparcia. Po prostu dodaj ten wiersz kodu zamiast tego, co napisałem powyżej:
getSupportActionBar().setDisplayShowCustomEnabled(true);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-07 22:45:57