Android活动中的常见进度条

时间:2016-03-17 06:00:05

标签: java android android-layout

我已经修改了解决方案。我能够获得进度条,但进度条永远不会被隐藏

这是创建具有相对布局

的进度条的类
public class ProgressBarHandler {
    private ProgressBar mProgressBar;
    private Context mContext;
    private View _baseView;
    private View _hideView;
    public ProgressBarHandler(Context context,View baseView, View hideView) {
        mContext = context;
        _baseView = baseView;
        _hideView = hideView;

        ViewGroup layout = (ViewGroup) _baseView;//((Activity) context).findViewById(android.R.id.content).getRootView();

        mProgressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleLarge);
        mProgressBar.setIndeterminate(true);

        RelativeLayout.LayoutParams params = new
                RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);

        RelativeLayout rl = new RelativeLayout(context);

        rl.setGravity(Gravity.CENTER);
        rl.addView(mProgressBar);

        layout.addView(rl, params);

        hide();
    }

    public void show() {
        mProgressBar.setVisibility(View.VISIBLE);
        _hideView.setVisibility(View.INVISIBLE);
    }

    public void hide() {
        mProgressBar.setVisibility(View.INVISIBLE);
        _hideView.setVisibility(View.VISIBLE);
    }
}

这是我的xml文件

<FrameLayout xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true"
    android:orientation="vertical"
    android:id="@+id/profile_activity">


<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
    android:id="@+id/layout_to_hide"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:id="@+id/app_bar_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:expandedTitleTextAppearance="@android:color/transparent"
        app:contentScrim="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@mipmap/wallpaper"
                android:orientation="vertical">

                <com.deerwalk.androidcommon.RoundedImageView
                    android:id="@+id/profile_image"
                    android:layout_width="100dp"
                    app:civ_border_color="#EEEEEE"
                    app:civ_border_width="4dp"
                    app:civ_shadow="true"
                    app:civ_shadow_radius="10"
                    app:civ_shadow_color="#8BC34A"
                    android:layout_height="100dp"
                    android:layout_alignWithParentIfMissing="false"
                    android:layout_centerInParent="true"
                    android:layout_gravity="center"
                    android:layout_margin="20dp"
                    android:src="@drawable/avatar" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:layout_below="@+id/profile_image"
                    android:orientation="vertical">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:id="@+id/txt_name"
                        android:layout_gravity="center_horizontal"
                        android:text=""
                        android:textColor="@color/white" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="match_parent"
                        android:id="@+id/txt_dob"
                        android:layout_gravity="center_horizontal"
                        android:text=""
                        android:layout_marginTop="5dp"
                        android:textColor="@color/white" />
                </LinearLayout>
            </RelativeLayout>



        </LinearLayout>
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>


<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">


</android.support.v7.widget.RecyclerView>

</android.support.design.widget.CoordinatorLayout>
</FrameLayout>

以下是调用进度条的活动类

public class ProfileActivity extends AppCompatActivity {

    FrameLayout profile_root_layout;
    CoordinatorLayout layot_to_hide;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);
        profile_root_layout = (FrameLayout) findViewById(R.id.profile_activity);
        layot_to_hide = (CoordinatorLayout) findViewById(R.id.layout_to_hide);
         new userProfileTask().execute();
    }




    public class userProfileTask extends AsyncTask<Void, Void, Boolean> {
        @Override
        protected void onPreExecute() {
            new ProgressBarHandler(getBaseContext(),profile_root_layout,layot_to_hide).show();
            super.onPreExecute();
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            try {
                Thread.sleep(2000);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Boolean aBoolean) {

            new ProgressBarHandler(getBaseContext(),profile_root_layout,layot_to_hide).hide();
        }
    }

}

进度条永远不会被隐藏。我在哪里做错了。

5 个答案:

答案 0 :(得分:1)

它非常简单,你可以通过多种方式做到。 1)您可以定义基本活动并编写进度对话框的代码,并扩展BaseActivity使用的Progressdialog中的所有活动。 2)您可以拥有自定义单独的类并用于所有活动。 等

以下是一个很好的示例,您可以像这个示例一样修改代码。 ProgressHud

或者也可以使用它。

答案 1 :(得分:0)

创建一个单独的类,然后使用参数创建一个静态方法,参数包含Activity ...在ur活动上调用此方法并在其中传递Activity名称

答案 2 :(得分:0)

我建议创建一个对话框并在你的活动类中调用

dialog = new Dialog(getActivity(), android.R.style.Theme_Black);
    View views = LayoutInflater.from(getActivity()).inflate(R.layout.activity_dialog, null);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawableResource(R.color.feed_item_bg);
    dialog.setContentView(views);
    dialog.show();

并在您的异步任务onPostExecute关闭对话框

dialog.dismiss();

答案 3 :(得分:0)

public static void getProgress(Activity activity,FrameLayout relativeLayout){
final ProgressBar pb;
int progressStatus = 0;
final Handler handler = new Handler();
pb = new ProgressBar(activity, null, android.R.attr.progressBarStyleHorizontal);
LayoutParams lp = new LayoutParams(550,LayoutParams.WRAP_CONTENT);
pb.setLayoutParams(lp);
LayoutParams params = (LayoutParams) pb.getLayoutParams();
pb.setLayoutParams(params);
pb.getProgressDrawable().setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
relativeLayout.addView(pb);
new Thread(new Runnable() {
@Override
public void run() {
int progressStatus = 0;
while(progressStatus < 100){
progressStatus +=1;
try{
Thread.sleep(20);
}catch(InterruptedException e){
e.printStackTrace();
}
final int finalProgressStatus = progressStatus;
handler.post(new Runnable() {
@Override
public void run() {
pb.setProgress(finalProgressStatus);
}
});
}
}
}).start(); // Start the operation
}

答案 4 :(得分:0)

您可以使用父活动。该活动类扩展了AppCompatActivity。其他活动将扩展此活动。例如,此活动的名称为AbstractActivty。

public class  AbstractActivty extends AppCompatActivity{

      AlertDialog alertDialogProgressBar;

      public void showLoadingProgressBar(String message, boolean cancalable) {
        if (isActivityPaused)
            return;

          AlertDialog.Builder adb = new AlertDialog.Builder(this);
          View view = getLayoutInflater().inflate(R.layout.alert_dialog_progressbar_layout,null);
          TextView tv = (TextView) view.findViewById(R.id.idTextViewMessage);
          tv.setText(message);
          adb.setView(view);
          alertDialogProgressBar = adb.create();
          alertDialogProgressBar.setCancelable(cancalable);
          alertDialogProgressBar.show();
}

 public void closeProgressBar() {
        if (alertDialogProgressBar == null) {
            return;
        }
        alertDialogProgressBar.hide();
    }

}

此类具有一个方法,可以由任何其他扩展该范围的活动调用 抽象活动

class MainActivty extends AbstractActivty{
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // when require to show progressbar
        showLoadingProgressBar("Loading....",true)

        // when required to hide call
        closeProgressBar();

 }

}    

注意,在“警报”对话框中,我们使用了自定义布局    “ alert_dialog_progressbar_layout.xml”

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="@dimen/text_padding_l">


    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guidelineVertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent=".3"
        />


    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/guidelineVertical"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <TextView
        android:id="@+id/idTextViewMessage"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Loading...."
        android:textColor="@color/colorPrimary"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/guidelineVertical"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

希望这会有所帮助。谢谢。