2014-10-24 10 views
7

Ich entwickle gerade eine Anwendung, in der ich einen stark modifizierten Split Action Bar benutze. Hier ist ein Link zu der aktuellen Status der App:AppCompat v7: 21 geteilte Aktionsleiste defekt?

screenshot

Sie erhalten eine transparente Aktionsleiste oben bemerkt, mit einer benutzerdefinierten Ansicht in sie aufgeblasen ist, mit einer zusammengehackt geteilt Aktionsleiste auf der Unterseite. Die Ansicht von unten ist eigentlich ein einzelnes Aktionselement mit einer benutzerdefinierten Ansicht, die darin aufgebläht ist, und showAlways = true.

Derzeit unterstützen I SDK v15 + nur und ich plane nicht wirklich auf zu ändern, dass, aber mit dem Lollipop AppCompat Bibliothek, die gerade veröffentlicht, habe ich beschlossen, es zu implementieren, so konnte ich einige dieser awesomeness in meiner App bekommen.

Ich habe mein Thema in Theme.AppCompat.Light geändert, und meine MainActivity erweitert jetzt ActionBarActivity anstelle von Activity.

Alle Verweise auf getActionBar haben jetzt getSupportActionBar, und nur mit den Änderungen eingeschaltet worden ist, ist es das, was jetzt meine Tätigkeit wie folgt aussieht:

another screenshot

Sie werden bemerken, die ich von der einen UI-Dump bekam Gerätemonitor, und es verschiebt die untere Aktionsleiste in ein seltsames Feld und ruft die Aktionsleiste auf und entfernt meine oberste benutzerdefinierte Ansicht.

Hier ist mein Code für die Einstellung meiner Aktionsleiste oben:

public void initializeActionBar(){ 
    View customNav = LayoutInflater.from(this).inflate(R.layout.action_bar_top, null); 

    actionBar = getSupportActionBar(); 
    actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.transparent_fifty_percent)); 

    final PopupWindow window = addPopupWindow(); 

    actionBarOptions = (ImageView)customNav.findViewById(R.id.options); 
    actionBarOptions.setVisibility(View.GONE); 
    actionBarOptions.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.vertical_ellipsis, app.scaleByDensity(48))); 
    actionBarOptions.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      window.showAsDropDown(actionBarOptions, 0, 0); 
     } 
    }); 
    TextView title = (TextView) customNav.findViewById(R.id.screen_title); 
    Typeface font1 = Typeface.createFromAsset(getAssets(), "Merriweather-Italic.ttf"); 

    title.setText("Parsley"); 
    title.setTypeface(font1); 

    actionBar.setCustomView(customNav); 
    actionBar.setDisplayShowCustomEnabled(true); 
    actionBar.setDisplayShowTitleEnabled(false); 
    actionBar.setDisplayShowHomeEnabled(false); 
    actionBar.setDisplayUseLogoEnabled(false); 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    new MenuInflater(this).inflate(R.menu.test, menu); 


    LinearLayout fullMenu = (LinearLayout) menu.findItem(R.id.full_menu).getActionView(); 


    ViewGroup.LayoutParams params; 

    icon1 = (ImageView) fullMenu.findViewById(R.id.action_item1); 
    params = icon1.getLayoutParams(); 
    params.width = getResources().getDisplayMetrics().widthPixels/4; 
    params.height = (int) (48 * getResources().getDisplayMetrics().density); 

    icon1.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.shopping_list_icon, app.scaleByDensity(32))); 
    icon2 = (ImageView) fullMenu.findViewById(R.id.action_item2); 
    icon3 = (ImageView) fullMenu.findViewById(R.id.action_item3); 
    icon4 = (ImageView) fullMenu.findViewById(R.id.action_item4); 
    icon2.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.recipe_box_icon, app.scaleByDensity(32))); 
    icon3.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.icon_search, app.scaleByDensity(32))); 
    icon4.setImageDrawable(app.svgToBitmapDrawable(getResources(), R.raw.icon_add, app.scaleByDensity(32))); 
    params = icon2.getLayoutParams(); 
    params.width = getResources().getDisplayMetrics().widthPixels/4; 
    params.height = (int) (48 * getResources().getDisplayMetrics().density); 
    params = icon3.getLayoutParams(); 
    params.width = getResources().getDisplayMetrics().widthPixels/4; 
    params.height = (int) (48 * getResources().getDisplayMetrics().density); 
    params = icon4.getLayoutParams(); 
    params.width = getResources().getDisplayMetrics().widthPixels/4; 
    params.height = (int) (48 * getResources().getDisplayMetrics().density); 
    if (!firstLoad) { 
     setBottomActionBarActive(); 
     setActiveTab(0); 
    } 

    optionsLoaded = true; 

    return true; 
} 

initializeActionBar() von onCreate in meiner Tätigkeit genannt wird. Irgendwelche Ideen, was ich falsch mache?

+0

Sie können eine benutzerdefinierte Symbolleiste erstellen und sie einmal oben, einmal darunter platzieren. Bitte überprüfen Sie diesen Beitrag: http://StackOverflow.com/Questions/34546160/How-to-enable-split-action-bar/34546493#34546493 – piotrek1543

Antwort

2

Symbolleiste sollte verwendet werden. In Ihrem Fall ist es eine Symbolleiste am oberen und eine am unteren Rand. Überprüfen Sie Android Team Blog, sie haben schöne Integrationsanleitung.

+1

Könnten Sie Link zur Integration für die Verwendung von zwei Symbolleisten für eine geteilte Aktionsleiste? –

+0

Fügen Sie dem relativen Layout nur zwei Symbolleisten hinzu. Toolbar ist Teil Ihres Layouts und kann wie jede andere Ansicht verwendet werden – user4182277

+0

Für diejenigen, die hier nach Antworten suchen, ist dies so nah an einem "Guide", wie ich auf dem [Android-Entwickler-Blog] finden konnte (http: // android- developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html), was hoffnungsvoll ist, was @ user4182277 sich auf – GrouchyPanda

0

Während die Lösung von user482277 für Instanzen mit einer traditionelleren geteilten Aktionsleiste funktioniert, die Aktionselemente, Navigationsschublade usw. verwendet, hat es für mich nicht ganz funktioniert. Was ich getan habe, war, ein Paar von benutzerdefinierten (zusammengesetzten) Ansichten zu erstellen, um sowohl die obere als auch die untere Aktionsleiste zu emulieren. Ich fand diese Situation viel besser, vor allem mit Rückwärtskompatibilität. Ich muss mir keine Sorgen über frühere Versionen machen, die die Aktionsleiste unterstützen, denn am Ende des Tages sind es nur zwei Klassen, die LinearLayout erweitern. Außerdem muss ich mir keine Gedanken über verschiedene Bildschirmgrößen (insbesondere Tablets) machen, die die geteilte Version nicht unterstützen.

1

Wenn Sie nur Ihre untere Aktionsleiste zurück wollen, können Sie einfach wieder zu appcompat v7: 20 wechseln, und es funktioniert für mich. Das Problem ist eine geteilte Aktionsleiste, die in appcomat v7: 21 nicht mehr unterstützt wird.

+0

Guter Fang, haben Sie eine Quelle auf sie nicht unterstützt die geteilte Aktionsleiste in appcompat 21? –

+0

Nach http://commonsware.com/blog/2014/11/18/android-5p0-deprecation-splitactionbarwhennarrow.html und https://code.google.com/p/android/issues/detail?id=77632 # c2, die geteilte Aktionsleiste wird leise von appcompat_v7: 21 gelöscht. – KCC

Verwandte Themen