Development Tip

ProgressBar가 Android에서 표시되는 동안 사용자 상호 작용을 비활성화하는 방법은 무엇입니까?

yourdevel 2021. 1. 10. 19:38
반응형

ProgressBar가 Android에서 표시되는 동안 사용자 상호 작용을 비활성화하는 방법은 무엇입니까?


사용자 지정 ProgressBar를 사용하고 있습니다. 이제 작업이 진행되는 동안 진행률 표시 줄이 표시되지만 사용자는 여전히보기 및 컨트롤과 상호 작용할 수 있습니다. ProgressDialog가 표시되는 것처럼 전체보기에서 사용자 상호 작용을 비활성화하려면 어떻게해야합니까?

기본보기 위에 투명보기를 사용하고 해당보기에 진행률 표시 줄을 표시하고 작업이 완료되면 해당보기를 숨겨야합니까?

아니면 내 parentView의 ID를 가져 와서 비활성화 하시겠습니까? 그러나 그런 다음보기 / 활동 / 조각에 대화 상자가 나타날 때 발생하는 것과 같이 배경을 어둡게 할 수 없습니다. 권리?

진행률 표시 줄이 표시되는 동안 사용자의 상호 작용을 허용하지 않는 방법을 알고 싶습니다.

감사


귀하의 질문 : ProgressBar가 Android에서 표시되는 동안 사용자 상호 작용을 비활성화하는 방법은 무엇입니까?

사용자 상호 작용을 비활성화하려면 다음 코드를 추가하면됩니다.

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

사용자 상호 작용을 다시 얻으려면 다음 코드를 추가하면됩니다.

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

다음은 예입니다. 참고 : 사용자 상호 작용을 비활성화하거나 유지하는 방법을 보여주는 예제를 제공합니다.

XML에 진행률 표시 줄을 추가합니다.

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/progressBar"
    android:visibility="gone"/>

MainActivity에서 버튼을 누르면 진행률 표시 줄이 표시되고 사용자 상호 작용이 비활성화됩니다.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mImageView = (ImageView) findViewById(R.id.imageView);
    mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
    mImageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mProgressBar.setVisibility(View.VISIBLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
        }
    });
}

그리고 사용자가 backPressed하면 진행률 표시 줄을 다시 제거하면 사용자 상호 작용이 유지됩니다.

  @Override
public void onBackPressed() {
    super.onBackPressed();
    mProgressBar.setVisibility(View.GONE);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}

비활성화 및 회색으로 표시된 디스플레이 기능을 추가하려면 xml 레이아웃 파일에 부모를 채우는 선형 레이아웃을 추가해야합니다. # B0000000하고는 그것의 배경을 설정 visibilty하는 방법에 대해 GONE. 그런 다음 프로그래밍 방식 visibility으로 VISIBLE.

이 도움을 바랍니다!


.NET Framework에 루트 레이아웃을 추가하여이 문제를 해결했습니다 ProgressBar.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:clickable="true"
    android:gravity="center"
    android:visibility="gone"
    android:id="@+id/progress">
    <ProgressBar
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:indeterminate="true"
        android:indeterminateTintMode="src_atop"
        android:indeterminateTint="@color/primary"/>
</LinearLayout>

루트 레이아웃을 클릭 가능하게 만들었습니다.

android:clickable="true"

참고 : 기본보기에서 RelativeLayout루트 권한을 갖고 마지막 위치 (마지막 자식)의 루트 레이아웃 내부에 위에서 언급 한 코드를 추가했습니다.

도움이 되었기를 바랍니다!!


그냥 설정 :

android:clickable="true" 

XML에

<ProgressBar...

이것 만이 마법을 만듭니다!


문서 기본 메소드 사용 progressbar.setCancelable (false)


Make a dialog with transparent background. The issue with getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); is that when app will go in background and come back user will be able to interact with UI components, a lot more handling. So for blocking UI make a transparent dialog and if you want to set time for hide/show. Do this in a runnable thread. So the solution will be

public class TransparentDialogHelper {

    private Dialog overlayDialog;

    @Inject
    public TransparentDialogHelper() {

    }

    public void showDialog(Context context) {
        if (AcmaUtility.isContextFinishing(context)) {
            return;
        }
        if (overlayDialog == null) {
            overlayDialog = new Dialog(context, android.R.style.Theme_Panel);
            overlayDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED);
        }
        overlayDialog.show();
    }

    public void hideDialog() {
        if (overlayDialog == null || AcmaUtility.isContextFinishing(overlayDialog.getContext())) {
            return;
        }
        overlayDialog.cancel();
    }
}

-------- Timer

Handler handler = new Handler();
handler.postDelayed( () -> {
    view.hideProgress();
}, 2000);

Make your parent layout as Relative Layout & add this :

    <RelativeLayout ... >

    <other layout elements over which prog bar will appear>

<RelativeLayout android:id="@+id/rl_progress_bar"
                android:layout_width="match_parent" android:clickable="true"
                android:layout_height="match_parent" >
<ProgressBar android:id="@+id/pb"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerInParent="true"
             android:indeterminateOnly="true"
             style="@android:style/Widget.DeviceDefault.ProgressBar"
             android:theme="@style/AppTheme.MyProgressBar"
    />
</RelativeLayout>

If you have floating buttons in your UI, they still grab all the focus & remain clickable when the progress bar is visible. for this use : (when your prog bar is visible & re-enable them when you make your prog bar invisible/gone)

fb.setEnabled(false);

To extend (pun intended) on the accepted Answer :

When you use kotlin you can use extension functions. That way you have a quick and nice looking method for blocking and unblocking UI.

fun AppCompatActivity.blockInput() {
    window.setFlags(
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
}

fun AppCompatActivity.unblockInput() {
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
}

fun AppCompatActivity.blockInputForTask(task: () -> Unit) {
    blockInput()
    task.invoke()
    unblockInput()
}

You can use the blocking and unblocking functions in your activity. Also, you can add more functionality like showing a Toast or something.

When using it in a custom view or any other view, you can simply cast the context to activity and use the functions.

Use blockInputForTask to surround simple linear tasks and blockInputand unblockInput when they are needed in different scopes.

You can use blockInputForTask like this:

blockInputForTask { 
    // Your lines of code
    // Can be multiple lines
}

ReferenceURL : https://stackoverflow.com/questions/36918219/how-to-disable-user-interaction-while-progressbar-is-visible-in-android

반응형