2017-02-21 108 views
1

我想用snackbar在应用程序的任何部分显示消息。我的意思是当无线网络被禁用, 应该有一个小吃店说无线网络禁用。这是在应用程序的任何部分(任何片段或任何活动)确定的。 目前,我在subfragment中确定了这一点,其中所有片段延伸subfragment,我也在MainActivity中使用它。 这工作正常。问题在于协调器布局为snackbar。我如何在每个XML中给这个coordinator layout? 什么是最好的解决方案?xml的协调器布局

回答

2

我认为常见的方式是遍历根视图,并找到孩子是谁的CoordinatorLayout的情况下,代码段可以是一击:

public View getCoordinateLayout(Activity activity) { 
    ViewGroup vg = (ViewGroup) activity.findViewById(android.R.id.content); 
    ViewGroup root = (ViewGroup) vg.getChildAt(0); 
    int childCount = root.getChildCount(); 
    for(int i=0;i<childCount;i++){ 
     View view = root.getChildAt(i); 
     if(view instanceof CoordinatorLayout){ 
      return view; 
     } 
    } 
    return null; 
} 
+0

我应该在哪里添加此代码? – MagdHo0506

+0

将它添加到你的BaseActivity和BaseFragment中,你也可以使它成为一个静态方法,并在你想要显示小吃店通过当前活动的地方调用它@MagdHo0506 –

2

看起来好像您要为所有其他布局使用父级布局结构。比方说,我们的母公司布局文件名为structure.xml,它看起来是这样的:

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</android.support.design.widget.CoordinatorLayout> 

然后,当你创建你可以抬高你平时布局的活动,说activity_main.xml,像这样:

@Override 
protected void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.structure); 
    LayoutInflater.from(this).inflate(R.layout.activity_main, (FrameLayout) findViewById(R.id.container), false); 
} 

每当你创建你平常布局的片段,说frag_main.xml,你可以做这样的:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) { 
    View view = inflater.inflate(R.layout.structure, group, false); 
    inflater.inflate(R.layout.frag_main, (FrameLayout) view.findViewById(R.id.container), false); 

    return view; 
} 

既然你ALR eady为你的片段/活动获得了一个父类,你应该能够轻松地为你的所有子类创建一些辅助方法。

希望这会有所帮助。