2012-05-25 64 views
6

是否可以添加进度条到ActionBarSherlock? 我需要在特定的时间显示和隐藏它。但它必须位于ActionBarSherlock内。如何添加进度条到ActionBarSherlock

我班的代码。你可以看到,我使用requestWindowFeature(Window.FEATURE_PROGRESS),但它没有任何区别。结果相同。 :

public class RecipeActivity extends SherlockActivity { 

private String picture; 
private String TAG = "RecipeActivity"; 
private ImageView viewPicture; 
private RecipeGeneral recipeGeneral; 
private Recipe recipe; 
private String [] pictures; 
private ArrayList<Step> steps; 
//private ImageView viewStar; 
private DataBaseFactory db; 
private NyamApplication application; 
private TextView viewDescription; 
private TextView userView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_PROGRESS); 
    setProgressBarIndeterminateVisibility(true); 

    try { 
     setContentView(R.layout.recipe_page); 

     getSupportActionBar().setDisplayShowTitleEnabled(false); 
     recipeGeneral = (RecipeGeneral)getIntent().getSerializableExtra("Recipe"); 
     Log.d(TAG, "recipeGeneral = " + recipeGeneral.toString()); 
     picture = Constants.URL + recipeGeneral.getImg_url(); 
     Log.d(TAG,"picture : " + picture); 
     viewPicture = (ImageView)findViewById(R.id.picture); 
     new DownloadImageTask().execute(pictures); 

     viewDescription = (TextView)findViewById(R.id.recepy_description); 
     TextView viewTitle = (TextView)findViewById(R.id.recepy_title); 
     TextView ratingView = (TextView)findViewById(R.id.txtTitle3); 
     userView = (TextView)findViewById(R.id.author_name); 

     application = (NyamApplication)getApplication(); 
     db = application.getDB(); 

     if (getIntent().getBooleanExtra("isFavorites", false) == true) { 
      Log.d(TAG, "isFavorites = " + getIntent().getBooleanExtra("isFavorites", false)); 

      viewDescription.setText(((Recipe)recipeGeneral).getDescription()); 
      viewTitle.setText(recipeGeneral.getTitle()); 
      Log.d(TAG, "Title = " + recipeGeneral.getTitle()); 
      ratingView.setText(String.valueOf(recipeGeneral.getFavorites_by())); 
      Log.d(TAG, "Rating = " + String.valueOf(recipeGeneral.getFavorites_by())); 
      userView.setText(((Recipe)recipeGeneral).getUser()); 
      Log.d(TAG, "User = " + ((Recipe)recipeGeneral).getUser()); 


      steps = db.getStepsByRecipeId(recipeGeneral.getId()); 
      if (steps != null) { 
       ((Recipe)recipeGeneral).setSteps(steps); 
      } 

     } else { 
      Log.d(TAG, "isFavorites = " + getIntent().getBooleanExtra("isFavorites", false)); 
      Object [] params = new Object[] {this, Constants.URL + recipeGeneral.getPath()+ Constants.JSON}; 

      new AsyncHttpGetRecipe().execute(params); 
      new AsyncHttpGetSteps().execute(params);  
      viewTitle.setText(recipeGeneral.getTitle()); 

      ratingView.setText(recipeGeneral.getFavorites_by()); 
      Log.d(TAG, "Rating = " + recipeGeneral.getFavorites_by()); 

     } 

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


private class DownloadImageTask extends AsyncTask<String,Void,Bitmap> { 

    Bitmap bitmap = null; 

    @Override 
    protected Bitmap doInBackground(String... str) { 
     try{ 
      InputStream in = new java.net.URL(picture).openStream(); 
      bitmap = BitmapFactory.decodeStream(new SanInputStream(in)); 
      //viewPicture.setImageBitmap(bitmap); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return bitmap; 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     super.onPostExecute(result); 
     viewPicture.setBackgroundDrawable(new BitmapDrawable(bitmap)); 
    } 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater(); 
    inflater.inflate(R.menu.item_page_menu, (com.actionbarsherlock.view.Menu) menu); 
    return super.onCreateOptionsMenu(menu); 
} 

public void onClick(View v) { 
    switch(v.getId()) { 
    case R.id.icon_little3: 
     Log.d(TAG,"further"); 
     if (getIntent().getBooleanExtra("isFavorites", false) == false) { 
      if (recipe != null && steps != null) { 
       recipe.setSteps(steps); 
       db.addRecipeToFavorites(recipe); 
      } 
     } 
    } 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch(item.getItemId()) { 
    case R.id.menu_further: 
     Log.d(TAG,"In menu_further"); 
     Intent stepIntent = new Intent(this, StepActivity1.class); 

     if (getIntent().getBooleanExtra("isFavorites", false) == true) { 
      Log.d(TAG,"id: " + recipeGeneral.getId()); 
      Log.d(TAG,"desc: " + recipeGeneral.getTitle()); 
      stepIntent.putExtra("Recipe1", recipeGeneral); 
     } else { 
      Log.d(TAG,"id: " + recipe.getId()); 
      Log.d(TAG,"desc: " + recipe.getTitle()); 
      recipe.setSteps(steps); 
      stepIntent.putExtra("Recipe1", recipe); 
     } 
     startActivity(stepIntent); 
     return true; 
    case R.id.menu_cart: 
     Toast.makeText(this, "Cart", 10000).show(); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 

} 


class AsyncHttpGetRecipe extends AsyncTask<Object, String, Recipe> { 

    @Override 
    protected Recipe doInBackground(Object... params) { 
     Recipe recipeAsync = null; 
     try { 
      recipeAsync = ApiFactory.getRecipe((Context)params[0], (String)params[1]); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     recipe = recipeAsync; 
     return recipeAsync; 
    } 

    @Override 
    protected void onPostExecute(Recipe recipeTemp) { 
     viewDescription.setText(recipeTemp.getDescription()); 
     Log.d(TAG, "Description = " + recipeTemp.getDescription()); 
     userView.setText(recipeTemp.getUser()); 
     Log.d(TAG, "User = " + recipeTemp.getUser()); 

    } 
} 

class AsyncHttpGetSteps extends AsyncTask<Object, String, ArrayList<Step>> { 

    @Override 
    protected ArrayList<Step> doInBackground(Object... params) { 
     ArrayList<Step> stepsAsync = null; 
     try { 
      stepsAsync = ApiFactory.getSteps((Context)params[0], (String)params[1]); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     return stepsAsync; 
    } 

    @Override 
    protected void onPostExecute(ArrayList<Step> stepsAsync) { 
     steps = stepsAsync; 
    } 
} 

}

回答

5

是的,你可以,ABS有这样的功能。的代码下一块是从ABS的演示示例应用:

public class Progress extends SherlockActivity { 
    Handler mHandler = new Handler(); 
    Runnable mProgressRunner = new Runnable() { 
     @Override 
     public void run() { 
      mProgress += 2; 

      //Normalize our progress along the progress bar's scale 
      int progress = (Window.PROGRESS_END - Window.PROGRESS_START)/100 * mProgress; 
      setSupportProgress(progress); 

      if (mProgress < 100) { 
       mHandler.postDelayed(mProgressRunner, 50); 
      } 
     } 
    }; 

    private int mProgress = 100; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     setTheme(SampleList.THEME); //Used for theme switching in samples 
     super.onCreate(savedInstanceState); 

     //This has to be called before setContentView and you must use the 
     //class in com.actionbarsherlock.view and NOT android.view 
     requestWindowFeature(Window.FEATURE_PROGRESS); 

     setContentView(R.layout.progress); 

     findViewById(R.id.go).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       if (mProgress == 100) { 
        mProgress = 0; 
        mProgressRunner.run(); 
       } 
      } 
     }); 
    } 
} 

该样品可以在样品\演示找到\ ABS的目录(在Progress.java Eclipse工作区)

+0

请看看sneepet,告诉我我做错了什么。 – Stas

+3

尝试setSupportProgressBarIndeterminateVisibility(true);而不是setProgressBarIndeterminateVisibility(true);和requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);而不是requestWindowFeature(Window.FEATURE_PROGRESS); – Style

+1

如果你想IndeterminateProgress – Style

16

是。您可以使用ABS将ProgressBar添加到ActionBar。

这是从源头上摘录如下规定,如果该解决方案帮助,+1楼主;-)

在你onCreate()方法中,添加这段代码:

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
setProgressBarIndeterminateVisibility(true); 

当您完成了需要显示ProgressBar的任务时,使用此代码隐藏ProgressBar:

setProgressBarIndeterminateVisibility(false); 

图片来源:https://stackoverflow.com/a/9157874/450534

+0

它不'吨显示进度条或任何aditional的动画。这两行只是禁用了我的工作栏。现在,它从操作栏中按任何按钮后抛出异常。没关系,我只需要进度条。我在做什么错了? – Stas

+0

@Stas:发布您正在使用的一些代码。 –

+0

你打电话给Window.FEATURE_PROGRESS –

3

对于应该使用的完全兼容性:

setSupportProgressBarIndeterminateVisibility(true); 

下面是一个例子:

public class MyActivity extends SherlockFragmentActivity { 
    //... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);   
     setContentView(R.layout.my_layout); 
     //... 
     setSupportProgressBarIndeterminateVisibility(true); 
    } 
}