为什么自定义进度条在Android中没有动画效果?

时间:2017-03-01 15:45:53

标签: android android-asynctask android-progressbar

在应用程序中,我已实现自定义进度条但自定义进度条

第一期: 第一个问题是Progress Bar只显示而不是动画,我在后台使用asynctask从外部数据库加载大量数据。

第二期:第二个问题是,当我点击链接加载大量数据时,它会打开另一个显示加载结果的活动。问题是当我按下链接时加载数据需要7-8秒,并且当切换另一个屏幕时显示黑屏3-4秒,我怎么能避免显示黑屏?

当我按下链接获取加载数据时,它需要3-4秒,在(第一个屏幕)当前屏幕上,然后出现黑屏3-4秒然后显示(第二个屏幕)结果,我不知道为什么它正在发生,我怎么能避免它。 我想当我点击链接然后应该执行一个进度条并进入secondActivity,而不显示黑屏。 请问我应该在第一个屏幕(当前屏幕)或第二个屏幕上使用进度对话框?还是在两个屏幕上?请任何帮助将不胜感激。

这是我的自定义适配器

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{

    Holder holder=new Holder();
    View rowView;
    rowView=inflater.inflate(R.layout.nav_navitem,null);
    holder.tv=(TextView)rowView.findViewById(R.id.tvlstName);

    holder.tv.setTypeface(face);
    holder.img=(ImageView)rowView.findViewById(R.id.img);
    holder.tv.setText(result[position]);

    holder.img.setImageResource(imageId[position]);
   rowView.setOnClickListener(new View.OnClickListener() {
                                   @Override
                                   public void onClick(View v) {
                                       //Toast.makeText(context,"you Clicked "+result[position],Toast.LENGTH_LONG).show();
                                       if(result[position]=="کھانوں کی فہرست".trim().toString())
                                       {

                                           new AsyncTask<Void, Void, String>() {
                                               @ Override
                                               protected void onPreExecute ( ) {
                                                   //for progress bar
                                                   progressDialog = new ProgressDialog(context);
                                                   progressDialog.show ( ) ;
                                                   progressDialog.setContentView(R.layout.custom_progressdialog);
                                                   progressDialog.setCancelable(true);

                                               }
                                               @Override
                                               protected String doInBackground(Void... params) {

                                                           //stuff that updates ui
                                                           context.startActivity(new Intent(context, SecondActivity.class));



                                                   return null ;
                                               }

                                               @Override
                                               protected void onPostExecute(String msg) {
                                                   if(progressDialog != null && progressDialog.isShowing()) {
                                                       progressDialog.dismiss();
                                                   }
                                               }


                                           }.execute(null, null, null);

                                       }

当屏幕切换SecondActivity.class然后显示黑屏。

这是SecondActivity类的一些相关代码。

public class SecondActivity extends AppCompatActivity {
private SQLiteDatabase sqLiteDatabase;
public static Typeface face;
ProgressDialog progressDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);
    face = Typeface.createFromAsset(getAssets(), "font/asunaskh.ttf");



    Toolbar toolbar=(Toolbar)findViewById(R.id.sectoolbar);
   setSupportActionBar(toolbar);
  getSupportActionBar().setDisplayHomeAsUpEnabled(true);

   CollapsingToolbarLayout collapsingToolbarLayout=(CollapsingToolbarLayout)
         findViewById(R.id.collapsing_toolbar);
   collapsingToolbarLayout.setTitle("کھانے کی فہرست");
    collapsingToolbarLayout.setCollapsedTitleTypeface(face);
    collapsingToolbarLayout.setExpandedTitleTypeface(face);


    progressDialog = new ProgressDialog(SecondActivity.this);
    progressDialog.setMessage("Loading");
    progressDialog.setCancelable(true);


    new AsyncTask<Void, Void, String>() {
        @ Override
        protected void onPreExecute ( ) {
            progressDialog.show ( ) ;
        }
        @Override
        protected String doInBackground(Void... params) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //stuff that updates ui
                    show_card();
                                        }
            });

            return null ;
        }

        @Override
        protected void onPostExecute(String msg) {
            if(progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
        }


    }.execute(null, null, null);

}
//show_card() method goes here
public void show_card(){....}

这是一个自定义进度条,在我点击链接时切换到SecondActivity之前显示 Custom Progress Bar

当活动开关形成电流到另一个活动时,这是Progress BAr的第二个屏幕截图(黑屏)。 Progress Bar Screen Shot

1 个答案:

答案 0 :(得分:0)

第一期:您需要在onProgressUpdate()中实施AsyncTask来设置进度条的动画。请参阅documentation for AsyncTask

第二期:我认为这里的问题是您要从AsyncTask doInBackground开始第二项活动,该活动不在用户界面上运行线。 (活动应该在UI线程上运行。)onPreExecuteonPostExecute都在UI线程上运行,因此您可以在那里移动第二个活动的开始。如果AsyncTask唯一做的就是启动Activity,那么您根本不需要AsyncTask - 只需启动Activity

请查看此SO question以及接受的答案以获得一些指导。