Итак, чтобы точно сказать вам, что происходит, позвольте мне сначала объяснить контекст.
Я следовал этому руководству: https://viksaaskool.wordpress.com/2014/11/16/using-auto-resize-to-fit-edittext-in-android/
который в основном представляет собой простой autoresizeEditText, основанный на библиотеке autoFitTextView ( https://github.com/grantland/android-autofittextview ).
Чего я хочу добиться: когда я нажимаю кнопку, весь макет увеличивается, и я имитирую щелчок на editText, чтобы пользователь мог ввести текст.
То, чего я достиг до сих пор: ну, почти все, за исключением того, что это работает только на некоторых устройствах, а не на других.
К вашему сведению, вот две анимированные картинки, которые иллюстрируют то, о чем я говорю:
ХОРОШЕЕ ПОВЕДЕНИЕ (Nexus 5 API 21): http://giphy.com/gifs/xTiTnH1hyuJzjnDl6w
ПЛОХОЕ ПОВЕДЕНИЕ (Nexus 6 API 22): http://giphy.com/gifs/3-1-2-3o85xDB4Wyve1jh0XK
Как вы можете видеть, масштабирование в порядке, а затем ввод текста в порядке, пока в некоторых случаях текст не появится после того, что кажется правой стороной немасштабированного editText. Но как только нужно изменить размер текста (или уменьшить масштаб), все возвращается на круги своя.
Итак, мой вопрос: у кого-нибудь есть идея, что может сделать это странное поведение? Кто-нибудь сталкивался с этой проблемой либо в autoFitTextView, либо в его расширении?
Заранее спасибо!
PS: я мог бы опубликовать некоторый код, но поскольку обе библиотеки + ссылки предоставлены и довольно длинны, я предпочитаю не публиковать их здесь, поскольку они в основном одинаковы. Что я могу предоставить, так это вызовы, сделанные для анимации представлений и отображения клавиатуры (даже если я не уверен, что это связано):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.add_message_layout, null);
mMessageEditText = (AutoResizeEditText) mView.findViewById(R.id.messageEditText);
mMessageEditText.setEnabled(false);
mMessageEditText.setEnableSizeCache(false);
mMessageEditText.setMovementMethod(null);
mMessageEditText.setInterface(this);
mMessageEditText.setMinTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, MIN_SP_TEXT_SIZE, getResources().getDisplayMetrics()));
mMessageEditText.setMaxHeight((int) DisplayUtils.convertDpToPixel(getActivity().getApplicationContext(), mMessageEditText.getMeasuredHeight()));
mMessageEditText.setLines(MAX_LINES_COUNT);
mMessageEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
mLastMessage = mMessageEditText.getText().toString();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (mMessageEditText.getLineCount() > MAX_LINES_COUNT) {
//If user tries to type more text than expected !
mMessageEditText.setText(mLastMessage);
mMessageEditText.setSelection(mLastMessage.length());
Toast.makeText(getActivity().getApplicationContext(), "Limit Reached", Toast.LENGTH_SHORT).show();
}
}
@Override
public void afterTextChanged(Editable s) {
mLastMessage = mMessageEditText.getText().toString();
mMessageEditText.invalidate();
}
});
mAddMessageButton = (RelativeLayout) mView.findViewById(R.id.rlAddMessage);
mAddMessageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setupAnimations();
animZoomIn();
}
});
mCardLayout = (LinearLayout) mView.findViewById(R.id.rearMainCardLayout);
return (mView);
}
private void setupAnimations() {
mPivotX = mMessageEditText.getPivotX() / mCardLayout.getMeasuredHeight();
mPivotY = mMessageEditText.getPivotY() / mCardLayout.getMeasuredWidth();
mZoomIn = new ScaleAnimation(1.0f, 1.3f, 1.0f, 1.3f, mPivotX, mPivotY);
mZoomIn.setDuration(1000);
mZoomIn.setFillAfter(true);
mSlideUp = new TranslateAnimation(0.0f, 100.0f, 0.0f, -100.0f);
mSlideUp.setDuration(1000);
mSlideUp.setFillAfter(true);
mEnterAnimation = new AnimationSet(true);
mEnterAnimation.setInterpolator(new LinearInterpolator());
mEnterAnimation.addAnimation(mZoomIn);
mEnterAnimation.addAnimation(mSlideUp);
mEnterAnimation.setFillAfter(true);
mEnterAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
mBeginX = mMessageEditText.getLeft();
mBeginY = mMessageEditText.getTop();
}
@Override
public void onAnimationEnd(Animation animation) {
mMessageEditText.setPressed(true); //EditText will get highlighted
mMessageEditText.setFocusable(true);
mMessageEditText.setFocusableInTouchMode(true);
mMessageEditText.setTextIsSelectable(true);
mMessageEditText.requestFocus();
mMessageEditText.invalidate();
mMessageEditText.setEnabled(true);
showKeyboard(getActivity().getApplicationContext(), mMessageEditText);
}
@Override
public void onAnimationRepeat(Animation animation) {}
});
mZoomOut = new ScaleAnimation(1.3f, 1.0f, 1.3f, 1.0f, mPivotX, mPivotY);
mZoomOut.setDuration(1000);
mZoomOut.setFillAfter(true);
mSlideDown = new TranslateAnimation(100.0f, 0.0f, -100.0f, 0.0f);
mSlideDown.setDuration(1000);
mSlideDown.setFillAfter(true);
mExitAnimation = new AnimationSet(true);
mExitAnimation.setInterpolator(new LinearInterpolator());
mExitAnimation.addAnimation(mZoomOut);
mExitAnimation.addAnimation(mSlideDown);
mExitAnimation.setFillAfter(true);
mExitAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {}
@Override
public void onAnimationEnd(Animation animation) {
mMessageEditText.invalidate();
}
@Override
public void onAnimationRepeat(Animation animation) {}
});
}
private void animZoomIn() {
mCardLayout.startAnimation(mEnterAnimation);
}
private void animZoomOut() {
mCardLayout.startAnimation(mExitAnimation);
}
private static void closeKeyboard(Context c, IBinder windowToken) {
InputMethodManager manager = (InputMethodManager)c.getSystemService(Context.INPUT_METHOD_SERVICE);
manager.hideSoftInputFromWindow(windowToken, 0);
}
private static void showKeyboard(Context c, EditText text) {
InputMethodManager manager = (InputMethodManager) c.getSystemService(Context.INPUT_METHOD_SERVICE);
manager.showSoftInput(text, InputMethodManager.SHOW_IMPLICIT);
}