Android 为什么我的显示器中缺少FloatingAction按钮?

Android 为什么我的显示器中缺少FloatingAction按钮?,android,android-layout,android-fragments,Android,Android Layout,Android Fragments,片段和代码应该显示列表(android:id=“@+id/rv_groups”),如果列表中存在任何组,否则它应该显示文本(“android:id=@+id/tv_noGroups”) 两种情况下都应显示floatingAction按钮,但它仅在显示列表时显示。它在显示@+id/tv\u nogroup显示时不显示。这是怎么解决的 以下是片段布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android

片段和代码应该显示列表
(android:id=“@+id/rv_groups”)
,如果列表中存在任何组,否则它应该显示文本
(“android:id=@+id/tv_noGroups”)

两种情况下都应显示
floatingAction按钮
,但它仅在显示列表时显示。它在显示
@+id/tv\u nogroup
显示时不显示。这是怎么解决的

以下是片段布局:

<LinearLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

<android.support.v7.widget.RecyclerView
    android:id="@+id/rv_groups"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_margin="@dimen/padd_5"
    android:layout_weight="1" />

<TextView
    android:id="@+id/tv_noGroups"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:textSize="18sp"
    android:visibility="gone" />

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_gravity="bottom"
    android:layout_marginBottom="@dimen/padd_5">

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_add"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/ic_add"
        app:fabSize="normal"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true" />
</RelativeLayout>
</LinearLayout>

下面是处理片段的代码:

public class GroupsFragment extends Fragment
{
    private Context m_context = null;
    private RecyclerView rv_groups;
    private GroupListAdapter adapter = null;
    private TextView tv_noGroups;
    private GroupListViewModel m_groupViewModel;

    public GroupsFragment ()
    {} // Required empty public constructor

    @Override
    public void onAttach (Context context)
    {
        super.onAttach(context);
        m_context = context;
        adapter = new GroupListAdapter(context);
    }

    @Override
    public void onCreate (@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        initData();
    }

    private void initData ()
    {
        m_groupViewModel = viewModelProviders.of(this).get(GroupListViewModel.class);
        m_groupViewModel.getAllGroups().observe(this, new Observer<List<GroupEntity>>() {
            @Override
            public void onChanged (@Nullable final List<GroupEntity> groups)
            {
                // Update the cached copy of groups
                adapter.setGroups(groups);
                doListView();
            }
        });
    }

    @Override
    public View onCreateView (@NonNull LayoutInflater inflater, ViewGroup container,
                          Bundle savedInstanceState)
    {
        // Inflate the layout for this fragment
        View view = inflater.inflate (R.layout.fragment_groups, container, false);

        //initialize widgets
        rv_groups = view.findViewById(R.id.rv_groups);
        tv_noGroups = view.findViewById(R.id.tv_noGroups);

        FloatingActionButton fab_add;
        fab_add = view.findViewById(R.id.fab_add);

        fab_add.setOnClickListener (new View.OnClickListener () {
            @Override
            public void onClick(View v) {
                getActivity().startActivityForResult(new Intent(getContext(), CreateGroupActivity.class), Activities.CREATE_GROUP);
            }
        });

        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(m_context);
        rv_groups.setLayoutManager(mLayoutManager);
        rv_groups.setItemAnimator(new DefaultItemAnimator());
        rv_groups.addItemDecoration(new DividerItemDecoration(m_context, DividerItemDecoration.VERTICAL));

        doListView();
        setHasOptionsMenu (true);

        return view;
    }

    /** Indicate on the UI that there are no groups to display. */
    private void showNoGroups ()
    {
        rv_groups.setVisibility(View.GONE);
        tv_noGroups.setVisibility(View.VISIBLE);
        tv_noGroups.setText(getResources().getString(R.string.string_noGroups));
    }

    /**
     * Set the group list view content.
     */
    private void doListView ()
    {
        if (m_groupViewModel == null || m_groupViewModel.countGroups() == 0)
        {
            showNoGroups();
        }
        else
        {
            rv_groups.setVisibility(View.VISIBLE);
            tv_noGroups.setVisibility(View.GONE);
        }
    }

    @Override
    public void onResume ()
    {
        super.onResume();
        doListView();
    }
}
公共类GroupsFragment扩展片段
{
私有上下文m_Context=null;
私人回收站查看rv_组;
私有GroupListAdapter=null;
私人文本视图电视组;
私有GroupListViewModel m_groupViewModel;
公共组碎片()
{}//必需的空公共构造函数
@凌驾
公共void-onAttach(上下文)
{
super.onAttach(上下文);
m_context=上下文;
适配器=新的GroupListAdapter(上下文);
}
@凌驾
创建时的公共void(@Nullable Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
initData();
}
私有void initData()
{
m_groupViewModel=viewModelProviders.of(this.get)(GroupListViewModel.class);
m_groupViewModel.getAllGroups().observe(这是一个新的观察者(){
@凌驾
公共void onChanged(@Nullable final List group)
{
//更新组的缓存副本
adapter.setGroups(组);
doListView();
}
});
}
@凌驾
创建视图时的公共视图(@NonNull layoutiner flater flatter,ViewGroup container,
Bundle savedInstanceState)
{
//为该碎片膨胀布局
视图=充气机充气(R.layout.fragment_组,容器,错误);
//初始化小部件
rv_组=view.findviewbyd(R.id.rv_组);
tv\u noGroups=view.findviewbyd(R.id.tv\u noGroups);
浮动操作按钮制作和添加;
fab_add=view.findviewbyd(R.id.fab_add);
fab_add.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
getActivity().startActivityForResult(新意图(getContext(),CreateGroupActivity.class),Activities.CREATE\u组);
}
});
RecyclerView.LayoutManager mLayoutManager=新的LinearLayoutManager(m_上下文);
rv_组。setLayoutManager(mLayoutManager);
rv_groups.setItemAnimator(新的DefaultItemAnimator());
rv_groups.addItemDecoration(新的DividerItemDecoration(m_上下文,DividerItemDecoration.VERTICAL));
doListView();
设置选项菜单(真);
返回视图;
}
/**在UI上指示没有要显示的组*/
私有void showNoGroups()
{
rv_组。设置可见性(视图。消失);
tv_nogroup.setVisibility(View.VISIBLE);
tv_noGroups.setText(getResources().getString(R.string.string_noGroups));
}
/**
*设置组列表视图内容。
*/
私有void doListView()
{
如果(m_groupViewModel==null | | m_groupViewModel.countGroups()==0)
{
showNoGroups();
}
其他的
{
rv_组设置可见性(视图可见);
tv_nogroup.setVisibility(View.GONE);
}
}
@凌驾
恢复时公开作废()
{
super.onResume();
doListView();
}
}

尝试使用ConstraintLayout,它更简单、更干净

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_groups"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_noGroups"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:gravity="center"
        android:textSize="18sp"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab_add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:layout_marginEnd="16dp"
        android:clickable="true"
        app:fabSize="normal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:srcCompat="@drawable/ic_add" />

</android.support.constraint.ConstraintLayout>


发生这种情况的原因是您的文本视图的高度为
匹配\u PARENT

<TextView
    android:id="@+id/tv_noGroups"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:textSize="18sp"
    android:visibility="gone" />

在此代码中,您告诉
TextView
LinearLayout
的顶部延伸到
LinearLayout
的底部

LinearLayout
是一种在空间足够的情况下逐个添加视图的布局。但是如果你告诉一个视图一路伸展,那么就没有更多的空间显示其他视图了

因此,对于您的
浮动操作按钮
,只需将其从屏幕上推出即可

当列表显示时,它会自动显示出来,因为在Java代码中,您将完全拉伸的tv\u-nogroupTextView
GONE
。这将隐藏文本视图,并允许
FloatingActionButton
返回

如果您想用当前的xml文件解决这个问题,有两种解决方案

  • 电视组添加权重<代码>android:layout_weight=“1”。您对RecyclerView也做了同样的操作,这就是为什么它可以允许FloatingActionButton出现,即使当RecyclerView拉伸整个屏幕时也是如此

  • tv\u noGroupsTextView中将高度更改为“包裹内容”。然后用
    android:layout\u gravity=“center”
    替换
    android:gravity=“center”

  • 然而,这只是解决布局问题的解释

    我想补充一点,说有更多的布局可供选择,
    LinearLayout
    不是一个适合您想要做的布局

    通常,如果要使用
    FloatingActionButton
    ,最好使用
    ConstraintLayout
    RelativeLayout
    ,原因有两个:

  • 在你的观点上有更多的自由
  • 视图可以相互重叠,因此您的
    FloatingActionButton
    可以悬停在其他组件上,如
    RecyclerView
    LinearLayout
    的使用限制太大,这导致您在布局中使用布局,这实际上是一件坏事

    这是谷歌发布的关于w