Сбой Android MenuItem setActionView (null)

На андроиде 4.0.3, если вызвать MenuItem.setActionView(null), а затем повернуть экран, у меня приложение вылетит.

Я пытаюсь эмулировать actionbar приложения GMail, где, если щелкнуть элемент, он превращается в progress bar.

Однако теперь он сохраняет состояние 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>

person Buttink    schedule 02.05.2012    source источник


Ответы (1)


Не могли бы вы опубликовать немного больше кода вокруг щелчка, который превращается в ProgressBar?

Я использую ABS, и вот некоторый код, который запускает AsyncTask и ProgressBar, когда пользователь нажимает кнопку (код находится внутри 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);

    }


}

}

person Davek804    schedule 03.05.2012