2012-05-02 17 views
2

android 4.0.3 MenuItem.setActionView(null)に電話して画面を回転すると、アプリケーションがクラッシュします。私がやろうとしています何Android MenuItem setActionView(null)クラッシュ

は、あなたがそれをprogress barに変身アイテムをクリックした場合GMailのアプリのactionbarをエミュレートしています。

しかし、今度はActionViewの状態を保存し、復元しようとすると、これが表示されます。

活動ComponentInfoを開始することができません{}: とjava.lang.ClassCastException:android.view.AbsSavedState $ 1は誰でも動作するコードを持っていますandroid.widget.ProgressBar $ SavedState

に キャストすることはできませんこのため?またはそれを修正する方法は?

私はactionbarsherlockを使用します。それは、4.03にあるので、単にすべてのシステムコールを呼び出すべきではありません。

コード:

OnCreate() 
    refreshMenuActionView = new ProgressBar(this.getActivity()); 
    refreshMenuActionView.setIndeterminateDrawable(this.getActivity().getResources().getDrawable(R.drawable.refresh_spinner)); 

AsyncTask.onPostExecute 
       if (refreshMenuItem != null) { 
        refreshMenuItem.setActionView(null); 
       } 

    @Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.loadable_menu, menu); 
    refreshMenuItem = menu.findItem(R.id.refreshMenuItem); 
    if (downloader != null && downloader.getStatus() == AsyncTask.Status.RUNNING) { 
      refreshMenuItem.setActionView(refreshMenuActionView); 
    } 
    searchMenuItem = menu.findItem(R.id.searchMenuItem); 
    super.onCreateOptionsMenu(menu, inflater); 
} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
     android:id="@+id/refreshMenuItem" 
     android:title="@string/refresh_item_title" 
     android:icon="@drawable/ic_menu_refresh" 
     android:showAsAction="ifRoom" /> 
    <item 
     android:id="@+id/searchMenuItem" 
     android:title="@string/search_item_title" 
     android:icon="@drawable/ic_menu_search" 
     android:showAsAction="always" /> 
</menu> 

答えて

0

あなたは、ProgressBarに変身クリック周りのコードのビットより多くを投稿できますか?

私はABSを使用して、ここでAsyncTaskを起動するいくつかのコードだと、プログレスバーは、ユーザーがボタンをクリックしたときに(コードがSherlockFragment内にある):

public class LoginFragment extends SherlockFragment { 
     ... 

    loginButton = (Button) getActivity().findViewById(R.id.loginButton); 
    loginButton.setOnClickListener(loginListener); 


public OnClickListener loginListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      ProgressDialog progressDialog = new ProgressDialog(getActivity()); 
      progressDialog.setMessage("Logging in..."); 
      LoginTask loginTask = new LoginTask((Polling) getActivity(), progressDialog); 
      loginTask.execute(); 

その後、ProgressDialogがASyncTaskを通じて制御されている(setVisibility )各方法において:

public class LoginTask extends AsyncTask<String, Void, Integer> { 

private ProgressDialog progressDialog; 
private Polling activity; 
private int id = -1; 
private JSONParser jsonParser; 
private static String loginURL = ""; 
private static String registerURL = ""; 
private static String KEY_SUCCESS = "success"; 
private static String KEY_ERROR = "error"; 
private static String KEY_ERROR_MSG = "error_msg"; 
private static String KEY_UID = "uid"; 
private static String KEY_NAME = "name"; 
private static String KEY_EMAIL = "email"; 
private static String KEY_CREATED_AT = "created_at"; 
private int responseCode = 0; 

public LoginTask(Polling activity, ProgressDialog progressDialog) 
{ 
    this.activity = activity; 
    this.progressDialog = progressDialog; 
} 

@Override 
protected void onPreExecute() 
{ 
    progressDialog.show(); 
} 

protected Integer doInBackground(String... arg0) { 

    // check for login response 
    try { 
     if (json.getString(KEY_SUCCESS) != null) { 
      String res = json.getString(KEY_SUCCESS); 

      if(Integer.parseInt(res) == 1){ 
       //user successfully logged in 
       // Store user details in SQLite Database 
       DatabaseHandler db = new DatabaseHandler(activity.getApplicationContext()); 
       JSONObject json_user = json.getJSONObject("user"); 
       //Log.v("name", json_user.getString(KEY_NAME)); 
       // Clear all previous data in database 
       userFunction.logoutUser(activity.getApplicationContext()); 
       db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), 
         json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));       

       responseCode = 1; 
       // Close Login Screen 
       //finish(); 

      }else{ 
       responseCode = 0; 
       // Error in login 
      } 
     } 

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

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

    return responseCode; 
} 

@Override 
protected void onPostExecute(Integer responseCode) 
{ 

    if (responseCode == 1) { 
     progressDialog.dismiss(); 
     activity.loginReport(responseCode); 


    } 
    if (responseCode == 0) { 
     progressDialog.dismiss(); 
     activity.loginReport(responseCode); 

    } 


} 

}

+0

追加されたコードとxml。 – Buttink

関連する問題