Frequently Asked Question
Wrapped Content Editbox in Android
Last Updated 11 months ago
If you want your Editbox annotation to be wrap content instead of having fixed width and height, you need to modify com.radaee.util.PopupEditAct:
- Setting layout params with WRAP_CONTENT instead of fixed width and height.
- Adding a listener to pass the new dimensions to the annotation.
Note: this implementation does not handle the case of the new annotation's dimension may override other page content.
package com.radaee.util; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.os.Handler; import android.text.Editable; import android.text.InputFilter; import android.text.InputType; import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.RelativeLayout; import com.radaee.viewlib.R; public class PopupEditAct extends Activity { private float originalWidth; private float originalHeight; private EditText m_txt; private RelativeLayout m_layout; public interface ActRetListener { void OnEditValue(String val); void onSizeChanged(int w, int h); } static public ActRetListener ms_listener; private ActRetListener m_listener; @Override protected void onCreate(Bundle savedInstanceState) { m_listener = ms_listener; ms_listener = null; super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); setContentView(R.layout.pop_edit); m_layout = (RelativeLayout)findViewById(R.id.lay_root); m_txt = (EditText)findViewById(R.id.annot_text); m_txt.setVisibility(View.INVISIBLE); Handler handler = new Handler(); Runnable runnable=new Runnable(){ @Override public void run() { int[] location = new int[2]; m_layout.getLocationOnScreen(location); Intent intent = getIntent(); float x = intent.getFloatExtra("x", location[0]) - location[0]; float y = intent.getFloatExtra("y", location[1]) - location[1]; originalWidth = intent.getFloatExtra("w", 0); originalHeight = intent.getFloatExtra("h", 0); int type = intent.getIntExtra("type", 0); int maxlen = intent.getIntExtra("max", 0); float size = intent.getFloatExtra("size", 0); m_txt.setText(intent.getStringExtra("txt")); RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); lp.addRule(RelativeLayout.ALIGN_PARENT_TOP); lp.leftMargin = (int)x; lp.topMargin = (int)y; m_txt.setMinWidth((int) originalWidth); m_txt.setMinHeight((int) originalHeight); m_txt.setLayoutParams(lp); m_txt.setTextSize(TypedValue.COMPLEX_UNIT_PX, size); BitmapDrawable bitmap = new BitmapDrawable();//add back m_txt.setBackgroundDrawable(bitmap); m_txt.setBackgroundColor(0xFFFFFFC0); m_txt.setPadding(2, 2, 2, 2); m_txt.setTextColor(0xFF000000); switch (type) { case 1: m_txt.setSingleLine(); m_txt.setInputType(InputType.TYPE_CLASS_TEXT + InputType.TYPE_TEXT_VARIATION_NORMAL); break; case 2: m_txt.setSingleLine(); m_txt.setInputType(InputType.TYPE_CLASS_TEXT + InputType.TYPE_TEXT_VARIATION_PASSWORD); break; case 3: m_txt.setSingleLine(false); m_txt.setInputType(InputType.TYPE_CLASS_TEXT + InputType.TYPE_TEXT_VARIATION_NORMAL + InputType.TYPE_TEXT_FLAG_MULTI_LINE); break; } if(maxlen > 1020) m_txt.setFilters(new InputFilter[]{new InputFilter.LengthFilter(1020)}); else if (maxlen > 0) m_txt.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxlen)}); else m_txt.setFilters(new InputFilter[]{new InputFilter.LengthFilter(1020)}); m_txt.setVisibility(View.VISIBLE); //show the keyboard InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(m_txt, InputMethodManager.SHOW_IMPLICIT); } }; handler.postDelayed(runnable, 50); } @Override public void onBackPressed() { if(m_txt == null || !m_txt.isShown()) return; updateAnnot(); super.onBackPressed(); overridePendingTransition(0, android.R.anim.fade_out); } @Override public boolean onTouchEvent(MotionEvent event) { if(event.getActionMasked() == MotionEvent.ACTION_UP) { if (m_txt == null || !m_txt.isShown()) return false; updateAnnot(); finish(); overridePendingTransition(0, android.R.anim.fade_out); } return true; } private void updateAnnot() { Editable value = m_txt.getText(); if(m_listener != null && (m_txt.getWidth() > originalWidth || m_txt.getHeight() > originalHeight)) m_listener.onSizeChanged(m_txt.getWidth(), m_txt.getHeight()); if(value != null && m_listener != null) m_listener.OnEditValue(value.toString()); } }
In onEditAnnot in com.Radaee.reader.PDFLayoutView, implement the created listener as follows:
@Override public void onSizeChanged(int w, int h) { if(m_annot != null) { float[] rect = m_annot.GetRect(); m_annot.SetRect(rect[0], rect[3] - (h / m_layout.vGetScale()), rect[0] + (w / m_layout.vGetScale()), rect[3]); } }