我有一个带有一个FAB和一个自定义进度栏的布局,它们都位于CoordinatorLayout内。 我的进度栏在数据加载期间隐藏所有布局内容,但不隐藏FAB。
我尝试将进度条移到布局的所有位置,但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>
我想在进度栏可见时隐藏FAB,在布局中设置正确的属性,而不是通过编程方式执行此操作。进度栏必须与FAB重叠。
答案 0 :(得分:1)
首先,隐藏进度条的可见性
<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
之间的区别是
不可见:
此视图是不可见的,但仍会占用布局空间 目的。
消失:
此视图不可见,并且不占用任何空间进行布局 目的。
答案 1 :(得分:1)
您可以在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);
}
答案 2 :(得分:1)
选项-1:。您必须通过更新FloatingActionButton
来修改elevation
的默认 Z轴行为。
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>