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-nogroupTextViewGONE
。这将隐藏文本视图,并允许FloatingActionButton
返回
如果您想用当前的xml文件解决这个问题,有两种解决方案
android:layout\u gravity=“center”
替换android:gravity=“center”
LinearLayout
不是一个适合您想要做的布局
通常,如果要使用FloatingActionButton
,最好使用ConstraintLayout
或RelativeLayout
,原因有两个:
FloatingActionButton
可以悬停在其他组件上,如RecyclerView
李>
LinearLayout
的使用限制太大,这导致您在布局中使用布局,这实际上是一件坏事
这是谷歌发布的关于w