2017-10-11 10 views
0

J'ai un BaseActivity qui contient cette structure:mise en page réapprouver avec Butterknife

<!-- activity_base --> 
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <include 
     layout="@layout/tool_bar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" /> 

    <include 
     layout="@layout/content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/tool_bar" 
     android:layout_above="@id/bottom_navigation" /> 

    <android.support.design.widget.BottomNavigationView 
     android:id="@+id/bottom_navigation" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     app:menu="@menu/bottom_navigation_menu" /> 

</RelativeLayout> 

Dans mon BaseActivity je contrôle la BottomNavigationView. Et j'ai créé plusieurs activités où je voudrais profiter du contenu inclus et charger seulement le contenu de cette activité. Aujourd'hui, le projet utilise butterknife Java. Et le projet devient géant car il réplique la structure supérieure du BaseActivity pour chaque sous-activité. Je voudrais refactoriser (dans le meilleur et le plus rapidement possible) le projet de sorte qu'il n'y ait qu'un seul activity_base.xml et d'autres activités contrôlent seulement son contenu (content.xml). J'ai vu quelque chose en utilisant ViewStub et un autre décrivant <merge> mais je n'ai pas compris comment appliquer les concepts facilement dans le projet puisque beaucoup utilisent l'activité et fragmentent, mon projet est seulement avec des activités.

+0

Vous pouvez utiliser exactement le même layout.xml pour toutes les activités? –

Répondre

0

Je ne suis pas complètement satisfait de cette solution, mais j'ai fini avec quelque chose comme ça sur une affaire similaire:

base_activity.xml

<...> 
    ..... Whatever you want at the top 
<.../> 


<!-- Container where your child Activity layout will be inflated --> 
<FrameLayout 
    layout="@+id/child_activity_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

<...> 
    ..... Whatever you want at the bottom 
<.../> 

BaseActivity

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

    ViewGroup parent = findViewById(R.id.child_activity_container); 
    View childView = inflateChildLayout(LayoutInflater.from(this), parent); 
    // The child Activity can have no layout (for some reason) 
    if (childView != null) { 
     parent.addView(childView); 
    } 

    ButterKnife.bind(BaseActivity.this); 

    // ... the rest of your onCreate 

} 

@Nullable 
protected abstract View inflateChildLayout(LayoutInflater inflater, ViewGroup parent); 

ChildActivity

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
//  setContentView(...); // Already managed by the base Activity so we don't need it 
} 

@Override 
protected View inflateChildLayout(LayoutInflater inflater, ViewGroup parent) { 
    return inflater.inflate(R.layout.activity_child, parent, false); 
} 

L'idée est BaseActivity gérer l'inflation de la disposition des enfants à l'intérieur de sa propre mise en page et de gérer l'appel à Butterknife. Comme le parent et l'enfant sont en réalité la même instance (comme ChildActivity étend BaseActivity) ButterKnife à la fois le parent et l'enfant Views. C'est pourquoi il est appelé après l'appel à inflateChildLayout

+0

Je ne connaissais pas ViewSub donc probablement vous pouvez l'utiliser pour améliorer le code ci-dessus. – Eselfar