FloatingActionButton виден несмотря на ProgressBar - PullRequest
0 голосов
/ 24 октября 2019

У меня есть макет с одним FAB и пользовательским Progressbar, все внутри CoordinatorLayout. Моя панель Progressbar скрывает все содержимое макета во время загрузки данных, но не FAB.

Я пытался переместить Progressbar во все позиции макета, но FAB всегда виден.

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/Recycler1"
    style="@style/MyStyle1"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:id="@+id/FAB1"
    style="@style/MyStyle2"
    app:srcCompat="@drawable/ic_event_black_24dp" />

<ProgressBar
    android:id="@+id/Progressbar1"
    style="@style/MyStyle3" />

Здесь код моей активности

public class MyFragment extends Fragment {

    private View view;
    private RecyclerView Recycler1;
    private ProgressBar Progressbar1;
...
    private Context context;
    private List<...> array_data;
    private RequestQueue queue;
...


    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        context = getActivity();
        view = inflater.inflate(R.layout.my_fragment, container, false);
        Progressbar1 = view.findViewById(R.id.Progressbar1);
        FloatingActionButton FAB1 = view.findViewById(R.id.FAB1);
...
        Recycler1 = view.findViewById(R.id.Recycler1);
        Recycler1.setHasFixedSize(true);
        Recycler1.setLayoutManager(new LinearLayoutManager(context));
...
        // Set Volley queue
        queue = Volley.newRequestQueue(context);

        return view;
    }


    @Override
    public void onResume() {
        super.onResume();
        Progressbar1.setVisibility(View.VISIBLE);
getData();
    }


    private void getData() {
        array_data = new ArrayList<>();
        JsonArrayRequest jsArrRequest = new JsonArrayRequest(
...
            @Override
            public void onResponse(JSONArray response) {
                try {
...
                    Progressbar1.setVisibility(View.GONE);
                } catch (Exception e) { e.printStackTrace(); }
            }
        }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { ... }})
        { @Override public Map<String, String> getHeaders() { return ... } };

        queue.add(jsArrRequest);
    }
}

РЕДАКТИРОВАТЬ Я забыл написать, что фон моего пользовательского индикатора выполнения не прозрачен, поэтому он автоматически перекрывает все остальные элементы в макете.

<style name="MyStyle3">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:layout_gravity">center</item>
    <item name="android:background">@color/colorWhite</item>
    <item name="android:indeterminateDrawable">@drawable/progress_bar</item>
</style>

Пользовательское отображение индикатора выполнения:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/progress">
        <rotate 
            android:toDegrees="1800">
            <shape
                android:innerRadius="25dp"
                android:shape="ring"
                android:thickness="4dp"
                android:useLevel="false">
                <gradient
                    android:endColor="@color/colorBlue"
                    android:startColor="@color/colorWhite"
                    android:type="sweep" />
            </shape>
        </rotate>
    </item>
</layer-list>

enter image description here

Я хочу скрыть FAB, когда Progressbar виден, устанавливая правильные свойства в макете и не делая этого программно. Прогрессбар должен перекрывать FAB.

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Вы можете создать метод в вашем activity как showProgress(boolean status)

private void showProgress(boolean status){
  if(status){
     Progressbar1.setVisibility(View.VISIBLE);
     FAB1.setVisibility(View.GONE); // decleare FAB1 globally like Progressbar1
  }else{
     Progressbar1.setVisibility(View.GONE);
     FAB1.setVisibility(View.VISIBLE);
  }
}

И вызывать его, когда хотите показать или скрыть свой progressbar.

Чтобы показать progressbar в вашем onResume

@Override
public void onResume() {
    super.onResume();
    showProgress(true);
    getData();
}

Чтобы скрыть progressbar в вашем getData

private void getData() {
        array_data = new ArrayList<>();
        JsonArrayRequest jsArrRequest = new JsonArrayRequest(
        //...
            @Override
            public void onResponse(JSONArray response) {
                try {
                    //...
                    showProgress(false); // call method here and pass false
                } catch (Exception e) { e.printStackTrace(); }
            }
        }, new Response.ErrorListener() { 
               @Override 
               public void onErrorResponse(VolleyError error) { 
                   // also here you have to close your progressbar 
                   showProgress(false);
                   //...
               }
            })
        { @Override public Map<String, String> getHeaders() { return ... } };

        queue.add(jsArrRequest);
    }
1 голос
/ 24 октября 2019

Опция - 1: Необходимо изменить стандартное Ось Z поведение FloatingActionButton, обновив elevation.

app:elevation="0dp"

Вариант - 2: Если вы хотите сохранить поведение FAB по умолчанию, вам нужно обновить my_fragment.xml примерно так:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/Recycler1"
            style="@style/MyStyle1"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/FAB1"
            style="@style/MyStyle2"
            app:srcCompat="@drawable/ic_event_black_24dp" />
    </androidx.coordinatorlayout.widget.CoordinatorLayout>


    <ProgressBar
        android:id="@+id/Progressbar1"
        style="@style/MyStyle3" />

</FrameLayout>
1 голос
/ 24 октября 2019

сначала, скрыть видимость индикатора выполнения

<ProgressBar
    android:id="@+id/Progressbar1"
    android:visibility="invisible"
    style="@style/MyStyle3" />

, после этого сделать индикатор прогресса видимым, когда вам нужно его использовать, и скрыть кнопку FAB

progressBar.setVisibility(View.VISIBLE);
FAB1.setVisibility(View.INVISIBLE);

, вы можете установить видимость FABв GONE вместо INVISIBLE разница между GONE и INVISIBLE равна

НЕВИДИМ:

Это представление невидимо, но онопо-прежнему занимает место для макета.

GONE:

Этот вид невидим, и он не занимает места для макета.

...