10

Я создаю собственный класс EditText, потому что мне нужно установить некоторые пользовательские шрифты; Однако теперь, когда я нажимаю на EditText андроид клавиатура не всплывал больше ...Custom EditText не показывает клавиатуру в фокусе

вот мой класс:

package ro.gebs.captoom.utils.fonts; 

import android.content.Context; 
import android.content.res.TypedArray; 
import android.graphics.Rect; 
import android.graphics.Typeface; 
import android.util.AttributeSet; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.EditText; 

import ro.gebs.captoom.R; 

public class CustomFontEditText extends EditText { 

    private Context context; 

    public CustomFontEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     if (!isInEditMode()) { 
      TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomFontEditText, 
        defStyle, 0); 

      assert a != null; 
      int fontId = a.getInteger(R.styleable.CustomFontEditText_fontNameEdit, -1); 
      if (fontId == -1) { 
       throw new IllegalArgumentException("The font_name attribute is required and must refer " 
         + "to a valid child."); 
      } 
      a.recycle(); 
      initialize(fontId); 
     } 
     this.context = context; 
    } 

    public CustomFontEditText(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
     this.context = context; 
    } 

    public CustomFontEditText(Context context) { 
     super(context); 
     this.context = context; 
    } 

    @SuppressWarnings("ConstantConditions") 
    public void initialize(int fontId) { 

     Typeface tf = null; 
     switch (fontId) { 
      case 0: 
       tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/OpenSans-Regular.ttf"); 
       break; 
      case 1: 
       tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/OpenSans-Bold.ttf"); 
       break; 
      case 2: 
       tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/OpenSans-Semibold.ttf"); 
       break; 
      case 3: 
       tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/OpenSans-ExtraBold.ttf"); 
       break; 
     } 

     setTypeface(tf); 
    } 
} 

и как я использую его в XML:

<ro.gebs.captoom.utils.fonts.CustomFontEditText 
         android:id="@+id/add_details_txt_edit" 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:layout_marginLeft="10dip" 
         android:hint="@string/type_here" 
         android:inputType="textPersonName" 
         custom:fontNameEdit="Regular" /> 

Я думал, что фокусные события были обработаны тем, что я расширяю класс EditText ...

Любые подсказки?

ответ

-3
editText.setOnTouchListener(new OnTouchListener() 
    { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     editText.setFocusableInTouchMode(true); 
     return false; 
    } 
    }); 
+0

это работает отлично, но я должен добавить его для каждого экземпляра класса CustomEditText, нет ли способа добавить это в свой пользовательский класс? –

+0

@AdrianOlar: вам нужно добавить для каждого вместо одного класса. Также, если этот ответ решил вашу проблему, примите его. – Sumant

+1

Это неправильный ответ. Ответ @lluismontero является точным. – Sarang

0

добавить

android:focusable="true" 
0
implements KeyListener on your custom EditText Class and override methods of KeyListener 
0

попробовать сделать ссылку для редактирования текста во время выполнения и вызвать запрос фокуса()

et.requestFocus() 

и попробовать

android:focusable="true" 
43

Это старый вопрос, но если кто-то заботится, проблема заключается в реализации конструктора:

public CustomFontEditText(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
    this.context = context; 
} 

Последний аргумент («defStyle»), который вы установили как 0, должно быть по умолчанию стиль для EditText. Если вы посмотрите на тот же конструктор на классе EditText:

public EditText(Context context, AttributeSet attrs) { 
    this(context, attrs, com.android.internal.R.attr.editTextStyle); 
} 

Как вы можете видеть, следует использовать стиль по умолчанию для EditText, так что ваш конструктор должен выглядеть следующим образом:

public CustomFontEditText(Context context, AttributeSet attrs) { 
    this(context, attrs, android.R.attr.editTextStyle); 
    this.context = context; 
} 
+0

Это правильное исправление – dzeikei

+1

final int com.android.internal.R.attr.editTextStyle = 0x0101006e, если кому-то интересно. – WALKER

+0

Удивительный намек! Теперь я всегда буду проверять источник для конструкторов –

Смежные вопросы