2012-04-21 73 views
2

我有一個簡單的登錄佈局,其中包含兩個EditText字段和一個用於登錄的按鈕。問題是,當軟鍵盤打開時,ActionBar會消失,並且我將焦點從EditText更改爲Button,並且當我按下後,ActionBar會再次返回。當軟鍵盤關閉時,不會發生該問題,並使用DPAD瀏覽EditTexts和Button。當焦點從EditText更改爲Button時,ActionBarSherlock操作欄消失

我使用ActionBarSherlock,並且僅在Android 2.x仿真器上出現問題,在4.x仿真器上一切正常。我知道ActionBarSherlock在Android版本中使用原生ActionBar實現,因此它可能是ActionBarSherlock代碼的問題。

我也執行了一個測試來檢查ActionBar.isShowing()的值,但是即使ActionBar在屏幕上不可見,這個返回值也是正確的。

我不知道在這種情況下發生了什麼,任何人有一些想法?

佈局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> 

片段CODE

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(); 
    } 

} 
+0

我目前正在開車,但它聽起來像你可能有清單中指定的選項,你平移視圖,而不是調整它的大小 – 2012-04-22 03:50:54

+0

這確實是問題,我添加了android:windowSoftInputMode =「stateUnspecified | adjustResize」此活動的清單節點,現在ActionBar停留在屏幕上。謝謝你的幫助!如果你寫這個問題的答案,我會接受它,否則我會在一段時間後回答我自己的問題。 – 2012-04-22 09:49:39

回答

4

ActionBarSherlock重視對預ICS兼容操作欄的內容視圖的內部,而不是在窗口的裝飾視圖。正因爲如此,它容易出現更多不便之處,從而可能導致出現意想不到的行爲,例如您所看到的行爲。

如果您設置了windowSoftInputMode以在IME打開時平移內容視圖,則操作欄將從屏幕消失。簡單的解決方法是使用不同的模式(例如,調整大小),這將重新佈局內容視圖並將操作欄保留在屏幕上。

相關問題