尽管有 ProgressBar,但 FloatingActionButton 可见
FloatingActionButton visible despite of ProgressBar
我有一个包含一个 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" />
这里是我的 Activity 代码
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>
我想在 Progressbar 可见时隐藏 FAB,在布局中设置正确的属性,而不是以编程方式执行此操作。进度条必须与 FAB 重叠。
首先,隐藏进度条的可见性
<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
的区别是
不可见:
This view is invisible, but it still takes up space for layout
purposes.
消失:
This view is invisible, and it doesn't take any space for layout
purposes.
您可以在 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
时调用它。
在您的 onResume
中显示 progressbar
@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: 您必须通过更新 elevation
来修改 FloatingActionButton
的默认 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>
我有一个包含一个 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" />
这里是我的 Activity 代码
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>
我想在 Progressbar 可见时隐藏 FAB,在布局中设置正确的属性,而不是以编程方式执行此操作。进度条必须与 FAB 重叠。
首先,隐藏进度条的可见性
<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
的区别是
不可见:
This view is invisible, but it still takes up space for layout purposes.
消失:
This view is invisible, and it doesn't take any space for layout purposes.
您可以在 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
时调用它。
在您的 onResume
progressbar
@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: 您必须通过更新 elevation
来修改 FloatingActionButton
的默认 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>