5

Voglio mettere la barra di navigazione (ha tasti funzione di sistema come back, home e menu, non Navigation Drawer!) Sul lato (a destra), come sotto, modificando AOSP.Barra di navigazione Android sul lato modificando AOSP

+-------------------------------------------------+---+ 
| Status bar (always)        | | 
+-------------------------------------------------+ N | 
| (Layout with background drawable)    | a | 
| +---------------------------------------------+ | v | 
| | Title/Action bar (optional)     | | | 
| +---------------------------------------------+ | B | 
| | Content, vertical extending     | | a | 
| |            | | r | 
| +---------------------------------------------+ | | 
+-------------------------------------------------+---+ 

Finora ho assumere RenderSessionImpl.java è il file da modificare per raggiungere questo obiettivo in quanto rende il layout dello schermo dipende dal valore dato orientamento dello schermo.

Ho trovato il frammento successivo e ho modificato il parametro di orientamento (ORIZZONTALE -> VERTICALE) in modo da creare un layout orizzontale, con la barra di navigazione sulla destra.

if (mNavigationBarOrientation == LinearLayout.HORIZONTAL && 
     mNavigationBarSize > 0) { 
    // system bar 
    try { 
     NavigationBar navigationBar = new NavigationBar(context, 
       hardwareConfig.getDensity(), LinearLayout.VERTICAL); // was LinearLayout.HORIZONTAL originallly 
     navigationBar.setLayoutParams(
       new LinearLayout.LayoutParams(
         LayoutParams.MATCH_PARENT, mNavigationBarSize)); 
     topLayout.addView(navigationBar); 
    } catch (XmlPullParserException e) { 

    } 
} 

I frammenti di codice AOSP originali sono di seguito.

/** 
* Inflates the layout. 
* <p> 
* {@link #acquire(long)} must have been called before this. 
* 
* @throws IllegalStateException if the current context is different than the one owned by 
*  the scene, or if {@link #init(long)} was not called. 
*/ 
public Result inflate() { 
    checkLock(); 

    try { 

     SessionParams params = getParams(); 
     HardwareConfig hardwareConfig = params.getHardwareConfig(); 
     BridgeContext context = getContext(); 


     // the view group that receives the window background. 
     ViewGroup backgroundView = null; 

     if (mWindowIsFloating || params.isForceNoDecor()) { 
      backgroundView = mViewRoot = mContentRoot = new FrameLayout(context); 
     } else { 
      if (hasSoftwareButtons() && mNavigationBarOrientation == LinearLayout.VERTICAL) { 
       /* 
       * This is a special case where the navigation bar is on the right. 
        +-------------------------------------------------+---+ 
        | Status bar (always)        | | 
        +-------------------------------------------------+ | 
        | (Layout with background drawable)    | | 
        | +---------------------------------------------+ | | 
        | | Title/Action bar (optional)     | | | 
        | +---------------------------------------------+ | | 
        | | Content, vertical extending     | | | 
        | |            | | | 
        | +---------------------------------------------+ | | 
        +-------------------------------------------------+---+ 

        So we create a horizontal layout, with the nav bar on the right, 
        and the left part is the normal layout below without the nav bar at 
        the bottom 
       */ 
       LinearLayout topLayout = new LinearLayout(context); 
       mViewRoot = topLayout; 
       topLayout.setOrientation(LinearLayout.HORIZONTAL); 

       try { 
        NavigationBar navigationBar = new NavigationBar(context, 
          hardwareConfig.getDensity(), LinearLayout.VERTICAL); 
        navigationBar.setLayoutParams(
          new LinearLayout.LayoutParams(
            mNavigationBarSize, 
            LayoutParams.MATCH_PARENT)); 
        topLayout.addView(navigationBar); 
       } catch (XmlPullParserException e) { 

       } 
      } 

      /* 
      * we're creating the following layout 
      * 
       +-------------------------------------------------+ 
       | Status bar (always)        | 
       +-------------------------------------------------+ 
       | (Layout with background drawable)    | 
       | +---------------------------------------------+ | 
       | | Title/Action bar (optional)     | | 
       | +---------------------------------------------+ | 
       | | Content, vertical extending     | | 
       | |            | | 
       | +---------------------------------------------+ | 
       +-------------------------------------------------+ 
       | Navigation bar for soft buttons, maybe see above| 
       +-------------------------------------------------+ 

      */ 

      LinearLayout topLayout = new LinearLayout(context); 
      topLayout.setOrientation(LinearLayout.VERTICAL); 
      // if we don't already have a view root this is it 
      if (mViewRoot == null) { 
       mViewRoot = topLayout; 
      } else { 
       LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
         LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); 
       layoutParams.weight = 1; 
       topLayout.setLayoutParams(layoutParams); 

       // this is the case of soft buttons + vertical bar. 
       // this top layout is the first layout in the horizontal layout. see above) 
       mViewRoot.addView(topLayout, 0); 
      } 

      if (mStatusBarSize > 0) { 
       // system bar 
       try { 
        StatusBar systemBar = new StatusBar(context, hardwareConfig.getDensity()); 
        systemBar.setLayoutParams(
          new LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, mStatusBarSize)); 
        topLayout.addView(systemBar); 
       } catch (XmlPullParserException e) { 

       } 
      } 

      LinearLayout backgroundLayout = new LinearLayout(context); 
      backgroundView = backgroundLayout; 
      backgroundLayout.setOrientation(LinearLayout.VERTICAL); 
      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
      layoutParams.weight = 1; 
      backgroundLayout.setLayoutParams(layoutParams); 
      topLayout.addView(backgroundLayout); 


      // if the theme says no title/action bar, then the size will be 0 
      if (mActionBarSize > 0) { 
       try { 
        FakeActionBar actionBar = new FakeActionBar(context, 
          hardwareConfig.getDensity(), 
          params.getAppLabel(), params.getAppIcon()); 
        actionBar.setLayoutParams(
          new LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, mActionBarSize)); 
        backgroundLayout.addView(actionBar); 
       } catch (XmlPullParserException e) { 

       } 
      } else if (mTitleBarSize > 0) { 
       try { 
        TitleBar titleBar = new TitleBar(context, 
          hardwareConfig.getDensity(), params.getAppLabel()); 
        titleBar.setLayoutParams(
          new LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, mTitleBarSize)); 
        backgroundLayout.addView(titleBar); 
       } catch (XmlPullParserException e) { 

       } 
      } 

      // content frame 
      mContentRoot = new FrameLayout(context); 
      layoutParams = new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
      layoutParams.weight = 1; 
      mContentRoot.setLayoutParams(layoutParams); 
      backgroundLayout.addView(mContentRoot); 

if (mNavigationBarOrientation == LinearLayout.HORIZONTAL && 
     mNavigationBarSize > 0) { 
    // system bar 
    try { 
     NavigationBar navigationBar = new NavigationBar(context, 
       hardwareConfig.getDensity(), LinearLayout.HORIZONTAL); 
     navigationBar.setLayoutParams(
       new LinearLayout.LayoutParams(
         LayoutParams.MATCH_PARENT, mNavigationBarSize)); 
     topLayout.addView(navigationBar); 
    } catch (XmlPullParserException e) { 

    } 
} 
     } 


     // Sets the project callback (custom view loader) to the fragment delegate so that 
     // it can instantiate the custom Fragment. 
     Fragment_Delegate.setProjectCallback(params.getProjectCallback()); 

     View view = mInflater.inflate(mBlockParser, mContentRoot); 

     // done with the parser, pop it. 
     context.popParser(); 

     Fragment_Delegate.setProjectCallback(null); 

     // set the AttachInfo on the root view. 
     AttachInfo_Accessor.setAttachInfo(mViewRoot); 

     // post-inflate process. For now this supports TabHost/TabWidget 
     postInflateProcess(view, params.getProjectCallback()); 

     // get the background drawable 
     if (mWindowBackground != null && backgroundView != null) { 
      Drawable d = ResourceHelper.getDrawable(mWindowBackground, context); 
      backgroundView.setBackground(d); 
     } 

     return SUCCESS.createResult(); 
    } catch (PostInflateException e) { 
     return ERROR_INFLATION.createResult(e.getMessage(), e); 
    } catch (Throwable e) { 
     // get the real cause of the exception. 
     Throwable t = e; 
     while (t.getCause() != null) { 
      t = t.getCause(); 
     } 

     return ERROR_INFLATION.createResult(t.getMessage(), t); 
    } 
} 

Ma il layout dello schermo non mostra alcuna differenza. Qualche idea per questo? File errato da modificare o logica errata? So che questo tipo di modifica non è consigliata ma ho davvero bisogno di farlo.

+0

Vedo un commento nel codice "Questo è un caso speciale in cui la barra di navigazione è sulla destra". Penso che si potrebbe provare a commentare se() lì per verificare se crea il layout desiderato – Mixaz

+0

@Mixaz, Ancora nessuna differenza. RenderSessionImpl.java potrebbe non essere rilevante per il perfezionamento dell'orientamento della barra di navigazione. Troverò un altro modo in [PhoneWindowManager.java] (https://android.googlesource.com/platform/frameworks/base/+/android-4.2.2_r1/policy/src/com/android/internal/policy/impl/ PhoneWindowManager.java) – HUKS

risposta

6

La barra di navigazione può essere posizionata sul lato destro modificando PhoneWindowManager.java e navigation_bar.xml.

Impostare mNavigationBarOnBottom su falso in PhoneWindowManager, quindi verrà eseguito il codice seguente.

// PhoneWindowManager.java 
// if mNavigationBarOnBottom = false 
// Landscape screen; nav bar goes to the right 
int left = displayWidth - mNavigationBarWidthForRotation[displayRotation]; 
mTmpNavigationFrame.set(left, 0, displayWidth, displayHeight); 
mStableRight = mStableFullscreenRight = mTmpNavigationFrame.left; 
if (navVisible) { 
    mNavigationBar.showLw(true); 
    mDockRight = mTmpNavigationFrame.left; 
    mRestrictedScreenWidth = mDockRight - mDockLeft; 
} else { 
    // We currently want to hide the navigation UI. 
    mNavigationBar.hideLw(true); 
} 
if (navVisible && !mNavigationBar.isAnimatingLw()) { 
    // If the nav bar is currently requested to be visible, 
    // and not in the process of animating on or off, then 
    // we can tell the app that it is covered by it. 
    mSystemRight = mTmpNavigationFrame.left; 
} 

Ciò crea la cornice per barra di navigazione a destra invece che sotto, ora la layout deve essere modificato per visualizzare i tasti del sistema verticalmente (navigation_bar.xml).

<!-- navigation bar for sw600dp (small tablets) --> 
<com.android.systemui.statusbar.phone.NavigationBarView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:background="#FF000000" 
    >  
    <FrameLayout android:id="@+id/rot0" 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     >  
     <LinearLayout 
      android:layout_height="match_parent" 
      android:layout_width="match_parent" 
      android:orientation="vertical" 
      android:clipChildren="false" 
      android:clipToPadding="false" 
      android:id="@+id/nav_buttons" 
      android:animateLayoutChanges="true" 
      >  
      <!-- navigation controls --> 
      ~ 
      <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back" 
       android:layout_width="match_parent" 
       android:layout_height="128dp" 
       android:src="@drawable/ic_sysbar_back" 
       systemui:keyCode="4" 
       android:layout_weight="0" 
       systemui:glowBackground="@drawable/ic_sysbar_highlight" 
       android:contentDescription="@string/accessibility_back" 
       /> 
      ~ 
     </LinearLayout> 
    </FrameLayout> 
</com.android.systemui.statusbar.phone.NavigationBarView>