programing tip

ProgressDialog에서 진행률 표시기를 쉽게 중앙에 배치하는 방법 (제목 / 텍스트가 전달되지 않은 경우)

itbloger 2020. 11. 26. 07:58
반응형

ProgressDialog에서 진행률 표시기를 쉽게 중앙에 배치하는 방법 (제목 / 텍스트가 전달되지 않은 경우)


progressDialog = ProgressDialog.show(this, null, null, true);일반적으로 호출 할 때 개발자는 진행률 표시 이미지 만 표시하기를 원하며 일반적으로 창 중앙에 배치 될 것으로 예상합니다 (적어도 일반 UI 디자인 관점에서). 그러나 이미지가 너무 왼쪽입니다. 텍스트를 매개 변수로 전달하지 않더라도 오른쪽의 (선택 사항) 텍스트에 대해 오른쪽의 패딩 / 여백이 여전히 계산되는 것 같습니다. 개발자의 삶을 조금 더 쉽게 만들 수 있습니다. :) 따라서 기본적으로 진행률 표시기를 중앙에 배치하기 위해 사용자 지정 대화 상자를 만들 필요가 없습니다.

( http://code.google.com/p/android/issues/detail?id=9697에 기능 요청으로 제출 했습니다. 개선 된 내용을 보려면 별표를 표시해주세요.)

이제 내 질문 :

  1. 사용자 지정 경고 대화 상자 클래스를 완전히 만들지 않고도 진행률 이미지를 쉽게 중앙에 배치 할 수있는 방법은 무엇입니까? 내가 간과했을 수있는 매개 변수가 있습니까?

  2. 또한 배경을 투명하게 설정하는 방법은 무엇입니까?

나는 또한 이것에 대해 궁금 해요 : https://stackoverflow.com/questions/2866141/how-to-put-custom-animation-into-a-progressdialog 사실은 아직 그것을 자신을 시도했지만하지 않은 사용자 정의를 작성할 수없는 경우 애니메이션, 즉 일종의 애니메이션 진행률 표시기를 원한다면 항상 ProgressDialog 클래스를 확장해야합니까? 그래도 ProgressDialog 클래스를 살펴보면 일반 드로어 블 ( ProgressDialog.java ) 외에는 찾을 수 없지만 AnimatedDrawable을 사용하지 않습니다.


나는 약간의 테스트를했고 이것을 달성하는 가장 좋은 방법은 커스텀을하는 것이라고 생각합니다 Dialog.

여기 내가 한 일의 예가 있습니다. 이것은 2 번 질문에 답하지만 1 번 문제를 고치는 방법에 대한 아이디어를 제공합니다.

public class MyProgressDialog extends Dialog {

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message) {
        return show(context, title, message, false);
    }

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message, boolean indeterminate) {
        return show(context, title, message, indeterminate, false, null);
    }

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message, boolean indeterminate, boolean cancelable) {
        return show(context, title, message, indeterminate, cancelable, null);
    }

    public static MyProgressDialog show(Context context, CharSequence title,
            CharSequence message, boolean indeterminate,
            boolean cancelable, OnCancelListener cancelListener) {
        MyProgressDialog dialog = new MyProgressDialog(context);
        dialog.setTitle(title);
        dialog.setCancelable(cancelable);
        dialog.setOnCancelListener(cancelListener);
        /* The next line will add the ProgressBar to the dialog. */
        dialog.addContentView(new ProgressBar(context), new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        dialog.show();

        return dialog;
    }

    public MyProgressDialog(Context context) {
        super(context, R.style.NewDialog);
    }
}

모든 정적 메서드는 링크 에서 나옵니다. 이상한 것은 아니지만 생성자에서 마법이 발생합니다. 매개 변수로 스타일을 전달하는지 확인하십시오. 그 스타일은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="NewDialog" parent="@android:Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowTitleStyle">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:background">@android:color/transparent</item>
    </style>
</resources>

그 결과 ProgressBar화면 중앙에서 회전합니다. 없이 backgroundDim와없는 Dialog상자.


쉽고 사용자 정의 가능한 방법 :

애니메이션 정의 : (res / drawable / loader_anim.xml)

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/image_for_rotation"
android:pivotX="50%"
android:pivotY="50%" />

또는:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:drawable="@drawable/img_loader_frame1"
android:duration="150"/>
...
<item
android:drawable="@drawable/img_loader_frame2"
android:duration="150"/>
...
</animation-list>

그런 다음 레이아웃 정의 : (res / layout / loader.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="center_vertical|center_horizontal"> 
<ProgressBar
android:layout_width="200dp"
android:layout_height="200dp"
android:indeterminateDrawable="@drawable/loader_anim" />
</LinearLayout>

그런 다음 인스턴스 진행 대화 상자 :

ProgressDialog dialog;
...
dialog = ProgressDialog.show(this,null,null);
dialog.setContentView(R.layout.loader);
...
process();
...
dialog.dismiss();

더 많은 정보:


나는 다음을 사용하며 레이아웃 파일이 필요하지 않으며 화면 중앙에 중앙에 테두리가없는 차단 진행률 표시 줄을 표시합니다.

private ProgressDialog progressDialog;


setUIToWait(true);

...long process...

setUIToWait(false);


private void setUIToWait(boolean wait) {

    if (wait) {
        progressDialog=ProgressDialog.show(this,null,null);
        progressDialog.setContentView(new ProgressBar(this));
    } else {
        progressDialog.dismiss();
    }

}

불확실한 진행률 표시 줄 만 표시하려는 경우.

ProgressDialog progressDialog = ProgressDialog.show(this, null, null, true, false);
progressDialog.setContentView(R.layout.progress_layout);

그리고 이름이 "progress_layout.xml"인 레이아웃 xml 파일을 만듭니다.

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

    <ProgressBar
        android:id="@+id/progressBar1"
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />

</LinearLayout>

아래 방법을 사용하여 완료하십시오.

In res->values->styles add the below code

<style name="MyGravity" parent="android:Theme.Material.Dialog" ></style>

Then create yours ProgressDialog as mentioned below

ProgressDialog dialog = new ProgressDialog(ctx, R.style.MyGravity);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

//create Dialog by using below method

@Override
protected Dialog onCreateDialog(int id) {

    switch (id) {

    case DIALOG1_KEY: {
        Dialog dialog = new Dialog(this,R.style.NewDialog);
        dialog.setContentView(R.layout.progress);
        dialog.setCancelable(true);
        return dialog;
    }
    }
    return null;
}

//then in your onCreate () you can call like below

@Override

public void onCreate(Bundle savedInstatncestate)

{

final Handler mHandler = new Handler();
showDialog(DIALOG1_KEY);
new Thread() {
public void run() {
try {
    sleep(3000);
    Runnable r = new Runnable() 
    {
    public void run() 
    {
               //do your background process

             dismissDialog(DIALOG1_KEY);
    }

        };
mHandler.post(r);
     } catch (Exception e) {
     }
   }
}.start();
}

You can always add one ProgressBar in all your activities where you might want to show centered ProgressDialog. Use following in acitivity.xml As:

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

In your Acitivity.java, use

ProgressBar bar = new Progress();
bar = (ProgressBar) findViewById(R.id.progressBar);

Now when you want to show the ProgressBar, just set its visibility to visible, and to cancel, set visibility to gone.

bar.setVisibility(View.VISIBLE);
bar.setVisibility(View.GONE);

Using ProgressBar and adding it to LinearLayout worked in my Case as follows:

ProgressBar mSpinner = new ProgressBar(this); 
mSpinner.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mSpinner.setBackgroundResource(R.drawable.loading_1);
mSpinner.setIndeterminate(true);

enter image description here

참고URL : https://stackoverflow.com/questions/3225889/how-to-center-progress-indicator-in-progressdialog-easily-when-no-title-text-pa

반응형