Android活动指示器?

Posted

技术标签:

【中文标题】Android活动指示器?【英文标题】:Android Activity Indicator? 【发布时间】:2011-06-28 21:07:13 【问题描述】:

如何在 android 中显示活动指示器?是否有任何 Android 库给定的方法?如果不是,请告诉我在 Android 中用于显示活动指示器的技术?

【问题讨论】:

你的意思是像在 ProgressDialog (developer.android.com/guide/topics/ui/…) 中使用的独立无限进度指示器之类的东西 “活动指示器”与 Android 中的“活动”类和概念非常混淆......没有想到这可能是进度对话框/栏:-) 但是有一个Android 中的一些东西,我不知道正确的名称,因此无法很好地用谷歌搜索它 【参考方案1】:

Android 中与 ios 活动指示器最直接等效的是 ProgressBar,但设置为不确定。因此,您可以将视图拖放到布局中,它会为您提供旋转动画。

<ProgressBar
    android:layout_
    android:layout_
    android:id="@+id/ctrlActivityIndicator"
    android:indeterminateOnly="true"
    android:keepScreenOn="true"
     />

您可以使用它向用户指示一些后台活动。

【讨论】:

如何改变圆形条的颜色? 要更改颜色可能最容易使用 Olegas 答案,然后您可以指定自己喜欢的任何颜色的可绘制对象。否则,您可能需要复制 ProgressBar 的 SDK 源代码并为其提供您自己的可绘制对象。【参考方案2】:

做这样的事

ProgressDialog mDialog = new ProgressDialog(getApplicationContext());
            mDialog.setMessage("Please wait...");
            mDialog.setCancelable(false);
            mDialog.show();

【讨论】:

如果您最终得到WindowManager$BadTokenException,请参阅***.com/q/1561803/650233 如果你想让对话框看起来像一个旋转图标而不是一个进度条,你可以使用 setProgressStyle(STYLE_SPINNER)。等效于警报中的 iOS ActivityIndi​​cator 那个代码给了我很长的错误(和崩溃),其中一部分是Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application。所以我使用了以下而不是答案:ProgressDialog mDialog = ProgressDialog.show(this, "dialog title", "dialog message", true); 如果从活动中运行,您可以通过替换 ProgressDialog mDialog = new ProgressDialog(getApplicationContext()); 来修复错误的令牌异常。与 ProgressDialog mDialog = new ProgressDialog(this); ProgressDialog 现在被标记为过时,我不建议使用。【参考方案3】:

在不使用模式 ProgressDialog 的情况下,还有另外两种显示活动指示器的方法。

您可以在布局中使用 ImageView 并对其应用动画。 Refer developer's site.

public void startAnimation() 
  // Create an animation
  RotateAnimation rotation = new RotateAnimation(
      0f,
      360f,
      Animation.RELATIVE_TO_SELF,
      0.5f,
      Animation.RELATIVE_TO_SELF,
      0.5f);
  rotation.setDuration(1200);
  rotation.setInterpolator(new LinearInterpolator());
  rotation.setRepeatMode(Animation.RESTART);
  rotation.setRepeatCount(Animation.INFINITE);

  // and apply it to your imageview
  findViewById(R.id.myActivityIndicator).startAnimation(rotation);

或者你可以使用xml-drawable来描述一个背景图片,它会有一些旋转动画:

首先描述一个drawable(即/res/drawable/my-indicator.xml)

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/spinner_black_76"
    android:pivotX="50%"
    android:pivotY="50%"
    android:framesCount="12"
    android:frameDuration="100" />

然后将其设置为某个视图的背景

【讨论】:

如何停止动画??【参考方案4】:
public class Mp3cutterActivity extends Activity 

    MP3Class mp3obj = null;
    TextView tv;
    MP3Class mp3classobj = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        Context thiscontext = this.getApplicationContext();
        mp3classobj = new MP3Class(thiscontext);
        setContentView(R.layout.main);

        Button btn = (Button)findViewById(R.id.startbutton);
        tv = (TextView)findViewById(R.id.textview1);
        btn.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub
                //show a wait indicator as well as the function that calls walkSdcard

                try 
                    new SearchSdCard(Mp3cutterActivity.this).execute();
                    // copyProtector.doCopyProtection();
                 catch (Exception e) 
                    System.out.println("in search SD card  " + e.getMessage());
                
            

            private void domp3stuff() 
                // TODO Auto-generated method stub
            
        );
    


class SearchSdCard extends AsyncTask<String, Void, Boolean> 

    Context context;    

    public ProgressDialog dialog;

    public SearchSdCard(Activity activity) 
        this.context = activity;
    

    protected void onPreExecute() 
        dialog = new ProgressDialog(context);
        dialog.setMessage("wait for a moment...");
        dialog.show();
    

    @Override
    protected Boolean doInBackground(String... params) 
        // TODO Auto-generated method stub
        boolean retval = true;
        mp3classobj.searchSdCard();
        return retval;
    

    @Override
    protected void onPostExecute(Boolean result) 
        // TODO Auto-generated method stub
        if (dialog.isShowing()) 
            dialog.dismiss();
            tv.setText("mp3 cutter is an app which cuts down a chunk of memory \nfrom your sdcard by \ndeleting the .mp3 files and more \nyou were made a BAKRA :-)");
            if(!result)    
                tv.setText("error occured !!");
            
        
    
    //refer below comment for the MP3class.java file details

【讨论】:

公共类 MP3Class 私有上下文 mcontext;公共 MP3Class(上下文上下文) mcontext = 上下文; 公共无效 searchSdCard() 字符串状态 = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) // 我的函数在这里你可以添加你的 【参考方案5】:

活动指示器只是被称为进度对话框。您可以通过编程方式创建。教程数量可用,搜索如何创建进度对话框/ProgressBar

ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
                progressDialog.setMax(100);
                progressDialog.setMessage("Its loading....");
                progressDialog.setTitle("ProgressDialog bar example");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
or
progressDialog.setProgressStyle(ProgressDialog.STYLE_CIRCULAR);

或者您可以使用 xml 创建它,设置可见性 visible 一旦任务完成设置 可见性消失

<ProgressBar
                android:id="@+id/loading_spinner"
                android:layout_
                android:layout_
                android:layout_marginTop="100dp"
                android:indeterminateTintMode="src_atop"
                android:indeterminateTint="@color/grey"
                android:layout_gravity="center" />

【讨论】:

以上是关于Android活动指示器?的主要内容,如果未能解决你的问题,请参考以下文章

如何完全删除选项卡中的活动选项卡指示器?

Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色

在Android中将ExpandableListView的指示器放在右侧

隐藏活动指示器

为自定义活动指示器视图使 UIView 半透明

UISearchDisplayController 活动指示器