XML的协调布局



我想使用 snackbar在应用程序的任何部分中显示消息。我的意思是,当wifi被禁用时,应该有一个Snackbar说禁用WiFi。这是在应用程序的任何部分(任何片段或任何活动)中确定的。目前,我在subfragment中确定所有片段扩展subfragment,并且在MainActivity中使用它。这很好。问题在于snackbar的协调布局。如何在每个XML中给出此coordinator layout?什么是最好的解决方案?

我认为,常见的方法是遍历root视图并找到是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;
}

似乎您想为所有其他布局使用父布局结构。假设我们的父母布局文件称为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;
}

由于您已经有一个片段/活动的父级课程,因此您应该能够轻松地为所有子类创建一些辅助方法。

希望这会有所帮助。

最新更新