Панель действий ActionBarSherlock исчезает при изменении фокуса с EditText на кнопку

У меня есть простой макет входа, который содержит два поля EditText и кнопку для входа. Проблема в том, что панель действий исчезает, когда открыта программная клавиатура, и я переключаю фокус с EditText на кнопку, и панель действий снова появляется, когда я нажимаю назад. Проблема не возникает, когда программная клавиатура закрыта, и я перемещаюсь по EditTexts и Button с помощью DPAD.

Я использую ActionBarSherlock, и проблема возникает только на эмуляторах Android 2.x, на эмуляторах 4.x все нормально. Я знаю, что ActionBarSherlock использует собственные реализации ActionBar в версиях Android, где они доступны, поэтому, вероятно, это проблема с кодом ActionBarSherlock.

Я также выполнил тест, чтобы проверить значение ActionBar.isShowing(), но он вернул true, даже когда панель действий не была видна на экране.

Я не могу понять, что происходит в этом случае, у кого-нибудь есть идеи?

XML макета

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:ignore="UselessParent" >

    <LinearLayout
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/username"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:hint="@string/username"
            android:inputType="textNoSuggestions"
            android:nextFocusUp="@+id/loginButton"
            android:imeOptions="actionNext" />

        <EditText
            android:id="@+id/password"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:hint="@string/password"
            android:inputType="textPassword"
            android:imeOptions="actionDone" />

        <Button
            android:id="@+id/loginButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:text="@string/login"
            android:textSize="20sp"
            android:nextFocusDown="@+id/username" />

    </LinearLayout>

</RelativeLayout>

КОД ФРАГМЕНТА

public class LoginFragment extends BaseFragment {

    @InjectView(R.id.loginButton) protected Button mLoginButton;
    @InjectView(R.id.username) protected EditText mUsernameEditText;
    @InjectView(R.id.password) protected EditText mPasswordEditText;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.login, container, false);
    }

    @Override
    public void onStart() {
        super.onStart();

        mLoginButton.setEnabled(allFieldsValid());
        mLoginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handleLogin();
            }
        });

        mPasswordEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE && allFieldsValid()) {
                    handleLogin();
                }
                return false;
            }
        });

        TextWatcher fieldValidatorTextWatcher = new TextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                mLoginButton.setEnabled(allFieldsValid());
            }
        };

        mUsernameEditText.addTextChangedListener(fieldValidatorTextWatcher);
        mPasswordEditText.addTextChangedListener(fieldValidatorTextWatcher);
    }

    private void handleLogin() {
        getSherlockActivity().setSupportProgressBarIndeterminateVisibility(true);

        Intent intent = new Intent(getActivity(), LoginService.class);
        intent.putExtra(BaseIntentService.EXTRA_STATUS_RECEIVER, mResultReceiver);
        intent.putExtra(LoginService.PARAM_USERNAME, mUsernameEditText.getText().toString());
        intent.putExtra(LoginService.PARAM_PASSWORD, mPasswordEditText.getText().toString());
        getActivity().startService(intent);
    }

    private boolean allFieldsValid() {
        return usernameFieldIsValid() && passwordFieldIsValid();
    }

    private boolean usernameFieldIsValid() {
        return !TextUtils.isEmpty(mUsernameEditText.getText());
    }

    private boolean passwordFieldIsValid() {
        return !TextUtils.isEmpty(mPasswordEditText.getText());
    }

    @Override
    public void onReceiveResult(int resultCode, Bundle resultData) {
        getSherlockActivity().setSupportProgressBarIndeterminateVisibility(false);
        super.onReceiveResult(resultCode, resultData);
    }

    @Override
    public void onReceiveResultSuccess(Bundle resultData) {
        ((LoginActivity) getActivity()).redirectToSelectTeamwebActivity(resultData.getInt(LoginService.RESULT_USER_ID));
    }

    @Override
    public void onReceiveResultFailure(Bundle resultData) {
        mPasswordEditText.setText("");
        String errorMessage = getString(R.string.invalid_login_credentials);
        Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show();
    }

}

person Jan-Henk    schedule 21.04.2012    source источник
comment
В настоящее время я за рулем, но похоже, что в манифесте указана опция, при которой вы перемещаете вид, а не изменяете его размер.   -  person Jake Wharton    schedule 22.04.2012
comment
Это действительно была проблема, я добавил android:windowSoftInputMode=stateUnspecified|adjustResize в узел манифеста для этого действия, и теперь панель действий остается на экране. Спасибо за вашу помощь! Если вы напишете ответ на этот вопрос, я приму его, в противном случае я отвечу на свой вопрос через некоторое время.   -  person Jan-Henk    schedule 22.04.2012


Ответы (1)


ActionBarSherlock прикрепляет панель действий совместимости к pre-ICS внутри представления содержимого, а не в представлении декора окна. Из-за этого он подвержен большему количеству неудобств, которые могут вызвать неожиданное поведение, подобное тому, которое вы видите.

Если вы установили windowSoftInputMode для панорамирования представления содержимого при открытом IME, панель действий исчезнет с экрана. Простым способом обойти это было бы использование другого режима (например, изменение размера), который изменит макет представления содержимого и сохранит панель действий на экране.

person Jake Wharton    schedule 23.04.2012