如果列表中存在任何组,则片段和代码应显示列表(android:id="@+id/rv_groups")
,否则应显示文本("android:id=@+id/tv_noGroups")
。
在两种情况下都应显示FloatingActionButton
,但是仅在显示列表时才显示。当显示@+id/tv_noGroups
时,它不会出现。该如何解决?
这是片段布局:
<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();
}
}
答案 0 :(得分:0)
尝试使用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>
答案 1 :(得分:0)
发生这种情况的原因是由于您的TextView的高度为MATCH_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
是一种布局,如果有足够的空间,则一个接一个地添加视图。但是,如果您告诉“视图”一直拉伸,则没有更多空间显示其他视图。
因此对于您的FloatingActionButton
,只需将其推离屏幕即可。
显示列表时它会自动显示,因为在Java代码中,您制作了完全拉伸的 tv_noGroups TextView GONE
。此Gone隐藏了TextView,并允许FloatingActionButton
退出。
如果要使用当前的xml文件解决此问题,则有两种解决方案。
为 tv_noGroups TextView添加权重。 android:layout_weight="1"
。您对RecyclerView进行了相同的操作,这就是即使RecyclerView拉伸整个屏幕时也可以使FloatingActionButton出现的原因。
在 tv_noGroups TextView中将高度更改为“ wrap_content”。然后将android:gravity="center"
替换为android:layout_gravity="center"
。
但是,这只是解决布局问题的说明。
我想补充一句话,说还有更多的布局可供选择,LinearLayout
并不是适合您想要做的布局。
通常,如果要使用FloatingActionButton
,则最好使用ConstraintLayout
或RelativeLayout
,这有两个原因:
FloatingActionButton
可以悬停在其他组件上,例如RecyclerView
。 LinearLayout
的使用确实有太多限制,这导致您在Layouts中使用Layouts,这实际上是一件坏事。
以下是Google发布的文档,内容涉及为什么您应避免使用嵌套布局以及嵌套布局如何降低应用程序的性能:https://developer.android.com/training/improving-layouts/optimizing-layout