Почему моя кнопка FloatingActionButton отсутствует на моем дисплее? - PullRequest
0 голосов
/ 28 января 2019

Фрагмент и код должны отображать список (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();
    }
}

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Причина, по которой это происходит, в том, что ваш 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-файлом, есть два решения.

  1. Добавьте вес в tv_noGroups TextView.android:layout_weight="1".Вы сделали то же самое для RecyclerView, поэтому он может позволить FloatingActionButton появляться даже тогда, когда RecyclerView растягивает весь экран.

  2. Измените высоту на "wrap_content" в tv_noGroups TextView.Затем замените android:gravity="center" на android:layout_gravity="center".

Тем не менее, это только объяснение, чтобы устранить проблему с макетом.

Я хочу добавить еще несколько слов, сказав, что есть больше макетов.LinearLayout - это не тот макет, который подходит для того, что вы хотите сделать.

Как правило, если вы хотите использовать FloatingActionButton, лучше использовать ConstraintLayout или RelativeLayout по двум причинам:

  1. Больше свободы в том месте, где вы размещаетеваши представления
  2. могут перекрывать друг друга, поэтому ваш FloatingActionButton может зависать над другими компонентами, такими как RecyclerView.

LinearLayout действительно слишком ограничивает его использование, из-за чего вы используете Layouts внутри Layouts, что на самом деле плохо.

Вот документация, опубликованная Google о том, почему вы должны избегать использования вложенных макетов и как вложенные макеты могут снизить производительность вашего приложения: https://developer.android.com/training/improving-layouts/optimizing-layout

0 голосов
/ 28 января 2019

Попробуйте использовать 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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...