0

Я разрабатываю приложение для nexus 7, и мне нужно, чтобы EditText отображал представление клавиатуры с числами и специальными символами. Я знаю, что вы можете установить макет для EditText с помощью inputType, но моя проблема в том, что если я установил inputType = "number", появится панель набора номера и невозможно переключиться на просмотр символов. Все, что мне нужно (это запрос клиента), - это открыть клавиатуру с макетом, отображаемым при нажатии на кнопку «123» в левом нижнем углу. Я пробовал все комбинации setRawInputType и setInputType без везения. Эта комбинация показывает Dialpadandroid default keyboard layout

txtLineCode.setInputType(InputType.TYPE_CLASS_TEXT); 
txtLineCode.setRawInputType(InputType.TYPE_CLASS_NUMBER); 

эта комбинация показывает клавиатуры от тоже

txtLineCode.setInputType(InputType.TYPE_CLASS_TEXT); 
txtLineCode.setRawInputType(InputType.TYPE_NUMBER_VARIATION_NORMAL|InputType.TYPE_CLASS_NUMBER); 

Вот скриншоты лучше объяснить, что мне нужно

это клавиатура по умолчанию

this is the default keyboard

это расположение показано, когда я нажимаю на «? 123», и это то, что мне нужно, чтобы показать, по умолчанию this is the layout shown when I click on "?123"

это расположение показано, если я изложу inputType = «число», которые не позволяют перейти к лекции макет enter image description here

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

большое спасибо

+0

Имейте в виду, что если вы получите эту работу (в чем я сомневаюсь), пользователи могут устанавливать различные клавиатуры, которые имеют совершенно другое поведение. – Siebe

+0

Да, я знаю, но моя цель - обеспечить правильное поведение с помощью клавиатуры на складе. Почему вы сомневаетесь в том, что он работает? – Apperside

+0

Если вы хотите отобразить ключи под? 123, то что нужно, чтобы пользователь переключился обратно. Попробуйте пользовательскую клавиатуру http://stackoverflow.com/questions/9577304/how-to-make-a-android-custom-keyboard –

ответ

1

Я думаю, что я нашел довольно элегантное решение: Я использовал вытяжку в текстовом поле (в моем случае drawableRight), и я назначен щелчком слушатель только на Drawable, который выполняет переключатель между цифровым и текстовым режимами. Я могу назначить слушатель только на Drawable, используя небольшой трюк, взятый из Handling click events on a drawable within an EditText:

public class MyEdittextextends EditText { 

    private Drawable drawableRight; 
    private Drawable drawableLeft; 
    private Drawable drawableTop; 
    private Drawable drawableBottom; 


//YOUR STUFF HERE 

@Override 
    public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) { 
     if (right != null) { 
      drawableRight = right; 
     } 

     if (left != null) { 
      drawableLeft = left; 
     } 
     super.setCompoundDrawables(left, top, right, bottom); 
    } 
View.OnClickListener _leftDrawableClickListener = null; 
View.OnClickListener _rightDrawableClickListener = null; 

public void setLeftDrawableClickListener(View.OnClickListener clickListener) { 
    _leftDrawableClickListener = clickListener; 
} 

public void setRightDrawableClickListener(View.OnClickListener clickListener) { 
    _rightDrawableClickListener = clickListener; 
} 

@Override 
    public boolean onTouchEvent(MotionEvent event) { 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      int x, y; 
      Rect bounds; 
      x = (int) event.getX(); 
      y = (int) event.getY(); 
      // this works for left since container shares 0,0 origin with bounds 
      if (drawableLeft != null) { 
       bounds = drawableLeft.getBounds(); 
       if (bounds.contains(x - fuzz, y - fuzz)) { 
        try { 
         _leftDrawableClickListener.onClick(this); 
        } catch (Exception e) { 
        } 
        if (consumeEvent) { 
         event.setAction(MotionEvent.ACTION_CANCEL); 
         return false; 
        } 
       } 
      } else if (drawableRight != null) { 
       bounds = drawableRight.getBounds(); 
       if (x >= (this.getRight() - bounds.width() - fuzz) && x <= (this.getRight() - this.getPaddingRight() + fuzz) && y >= (this.getPaddingTop() - fuzz) && y <= (this.getHeight() - this.getPaddingBottom()) + fuzz) { 

        try { 
         _rightDrawableClickListener.onClick(this); 
        } catch (Exception e) { 
        } 
        if (consumeEvent) { 
         event.setAction(MotionEvent.ACTION_CANCEL); 
         return false; 
        } 
       } 
      } else if (drawableTop != null) { 
       // not implemented yet 
      } else if (drawableBottom != null) { 
       // not implemented yet 
      } 
     } 

     return super.onTouchEvent(event); 
    } 


@Override 
    protected void finalize() throws Throwable { 
     drawableRight = null; 
     drawableBottom = null; 
     drawableLeft = null; 
     drawableTop = null; 
     super.finalize(); 
    } 

} 

После того, как обычай EditText был создан, я использовал этот код в моей деятельности

myEdittext = (EditText) findViewById(R.id.myEdittext); 
     myEdittext.setRightDrawableClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (myEdittext.getInputType() != InputType.TYPE_CLASS_TEXT) { 
        myEdittext.setInputType(InputType.TYPE_CLASS_TEXT); 
        myEdittext.setRawInputType(InputType.TYPE_CLASS_TEXT); 
        myEdittext.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.keyboard_123, 0); 

       } else { 
        myEdittext.setRawInputType(InputType.TYPE_CLASS_NUMBER); 
        myEdittext.setInputType(InputType.TYPE_CLASS_NUMBER); 
        myEdittext.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.keyboard_abc, 0); 
       } 

      } 
     }); 

это результат: когда EditText впервые показано, появляется как этот

enter image description here

и нажав на изображение «ABC» становится как этот

enter image description here

надеюсь, что это может помочь кому-то