2017-02-22 2 views
0

В настоящее время я разрабатываю приложение для Android, которое может получать пользовательский ввод с помощью мягкой клавиатуры. Но есть какая-то проблема, когда моя клавиатура появляется, есть только английские клавиатуры, когда я использую этот код:Google IME в Android

((InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 

И дисплей Google IME без моего языка по умолчанию (Это означает, что я не мог изменить на другой языке из-за отсутствия вкладок для выбора), но я ищу целую статью, похоже, нет способа изменить язык IME по коду.

Я использую LIBGDX, ни его элемент ui (TextField), ни вызов его с Android не могут показать Google IME с моим языком по умолчанию (китайский). Но если я использую систему IME, она может работать так, как ожидалось.

Для устранения других неполадок я могу использовать Google IME в другом приложении без каких-либо проблем, и я также отправляю код, который я использовал для вызова InputMethodManager forecly.

package my.package; 
import android.app.Service; 
import android.content.Context; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.os.Build; 
import android.os.Handler; 
import android.os.LocaleList; 
import android.os.Looper; 
import android.text.InputType; 
import android.util.DisplayMetrics; 
import android.view.inputmethod.InputMethodManager; 
import android.view.inputmethod.InputMethodSubtype; 
import android.widget.EditText; 

import java.util.Locale; 

import my.package.Debugger; 


public final class AndroidKeyboardAdapter implements KeyboardAdapter{ 
    InputMethodManager imm; 
    Context context; 
    EditText text; 
    public AndroidKeyboardAdapter(Context context) { 
     this.context = context; 
     imm = (InputMethodManager)context.getSystemService(Service.INPUT_METHOD_SERVICE); 
    } 

    public void showKeyboard() { 
     text = new EditText(context); 

     Locale locale; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
      locale = context.getResources().getConfiguration().getLocales().get(0); 
      for(int i = 0; i < context.getResources().getConfiguration().getLocales().size();i++) 
       Debugger.LogInConsole(context.getResources().getConfiguration().getLocales().get(i).getCountry()); // show TW 
     } else{ 
      //noinspection deprecation 
      locale = context.getResources().getConfiguration().locale; 
      Debugger.LogInConsole(locale.getCountry()); // not doing anything 
     } 
     Debugger.LogInConsole(Locale.getDefault().toString()); //show zh_tw 


     ((InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); 
    } 

    public void hideKeyboard() { 
     imm.hideSoftInputFromWindow(text.getWindowToken(), 0); 
    } 


    public void onResume() { 
     text.requestFocus(); 

     text.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       imm.showSoftInput(text, 0); 
      } 
     },200); 
    } 

    @Override 
    public String getText() { 
     return text.getText().toString(); 
    } 
} 

обеспечивают также исходный код, который LIBGDX процесс на IMM:

@Override 
    public void setOnscreenKeyboardVisible (final boolean visible) { 
     handle.post(new Runnable() { 
      public void run() { 
       InputMethodManager manager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
       if (visible) { 
        View view = ((AndroidGraphics)app.getGraphics()).getView(); 
        view.setFocusable(true); 
        view.setFocusableInTouchMode(true); 
        manager.showSoftInput(((AndroidGraphics)app.getGraphics()).getView(), 0); 
       } else { 
        manager.hideSoftInputFromWindow(((AndroidGraphics)app.getGraphics()).getView().getWindowToken(), 0); 
       } 
      } 
     }); 
    } 

ответ

0

Edit: Найдено относительное issue, и согласно отчету, LIBGDX сделать специфическую конфигурацию для английского разработчика, если вы являетесь разработчиком другого языка, вы не должны использовать интерфейс TextField и напрямую обращаться к IMM, просто используйте код ниже с пользовательским интерфейсом Label, и все будет в порядке ...

label.addListener(new ClickListener() { 
     @Override 
     public void clicked(InputEvent event, float x, float y) { 
      Gdx.input.getTextInput(new Input.TextInputListener() { 
       @Override 
       public void input(String text) { 
        label.setText(text); 
        Debugger.LogInConsole(text); 
       } 

       @Override 
       public void canceled() { 

       } 
      },"","",""); 
     } 
    }); 

Отработайте много времени на чтение исходного кода и надейтесь, что это может помочь другим.

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