Клавиатура Android не открыта в webView` - PullRequest
10 голосов
/ 31 августа 2011

Я использую WebView в AlertDialog для аутентификации пользователя в твиттере. но когда я нажимаю на поле в веб-представлении, клавиатура Android не открывается. Вот мой код, который показывает, как я добавил веб-просмотр в диалоговом окне предупреждения. я неявно вызываю клавиатуру Android, но она открывает клавиатуру за диалоговым окном оповещения.

вот мой код.

public static void webViewDialog(final String authorizationURL, final int type)
{

    final boolean correctPin;
    System.out.println("In webViewDialog");
    container = new LinearLayout(context);
    container.setOrientation(LinearLayout.VERTICAL);

    container.setMinimumWidth(200);
    container.setMinimumHeight(320); 

    webView = new WebView(context);
    webView.setMinimumWidth(200);
    webView.requestFocusFromTouch();
    webView.setMinimumHeight(380);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebViewClient(new TwitterWebViewClient());
    webView.loadUrl(authorizationURL);
    webView.setBackgroundColor(0xFFbbd7e9);
    container.addView(webView);

    Builder webDialog = new AlertDialog.Builder(context);

    webDialog.setView(container).setTitle("Twitter Login")
            .setPositiveButton("Ok", new DialogInterface.OnClickListener()
        {

                @Override
                public void onClick(DialogInterface dialog, int which) 
                {

                    if (type == 0) 
                    {
                          twitterPinCodeDialog();
                        dialog.dismiss();

                    }
                }
        }).show();
    showVirtualKeyboard();

}
public static void showVirtualKeyboard()
{
    Timer timer = new Timer();
    timer.schedule(new TimerTask()
    {

         @Override
         public void run()
         {
              InputMethodManager m = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);

              if(m != null)
              {
                // m.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
                m.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);
              } 
         }

    }, 100);  
}

Ответы [ 5 ]

21 голосов
/ 31 августа 2011

Вот мое решение этой проблемы:

Поместите фиктивный текст для редактирования, установите его видимость на GONE и добавьте его в содержащий LinearLayout после добавления WebView в макет.

Пример:

AlertDialog.Builder builder = new AlertDialog.Builder(this);

LinearLayout wrapper = new LinearLayout(this);
WebView webView = new WebView(this);
EditText keyboardHack = new EditText(this);

keyboardHack.setVisibility(View.GONE);

webView.loadUrl(url);

wrapper.setOrientation(LinearLayout.VERTICAL);
wrapper.addView(webView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
wrapper.addView(keyboardHack, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);              

builder.setView(wrapper);

builder.create().show();

После того, как это будет сделано, все должно работать должным образом, и когда вы выбираете элемент в WebView, клавиатура отображается, как и ожидалось.

4 голосов
/ 13 мая 2013

Я использую PopupWindow с WebView внутри и столкнулся с той же проблемой, но если я установил focusable в true для родительского элемента, проблема исчезнет:

popupWindow.setFocusable(true);

Надеюсь, это поможет!

0 голосов
/ 06 июня 2015

У меня была похожая проблема, и я решил ее следующим образом:

  1. Я переопределяю метод onCreateView () во фрагменте диалога и определяю всю конфигурацию представления для моего веб-представления.

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    
        View view = inflater.inflate(R.layout.webview, container, false);
        // do some config
        // some other stuffs
    
        loginpage.loadUrl(url);
        return view;
    }
    
  2. В методе onCreateDialog () я просто добавляю их.

    @Override
    public Dialog onCreateDialog(Bundle savedInstaceState) {
        Dialog dialog = super.onCreateDialog(savedInstaceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }
    

В моем случае я хотел показать диалог без заголовка. Поэтому, поскольку DialogBuilder позаботился о создании представления диалога, я решил переопределить onCreateView () и просто вызвать super.onCreateDialog () и добавить конфигурацию моего окна.

0 голосов
/ 16 января 2012

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

    TwitterDialog fb=new TwitterDialog(this);
    fb.abc();
    //fb.dismiss();



class TwitterDialog extends Dialog {
    Context context;
    String url="https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=https://mail.google.com/mail/&ss=1&scc=1&ltmpl=default&ltmplcache=2";
     public TwitterDialog(Context context) {
            super(context);
            this.context=context;
        }
 void abc(){
            LinearLayout mContent = new LinearLayout(context);
            mContent.setOrientation(LinearLayout.VERTICAL);
            final float scale = context.getResources().getDisplayMetrics().density;
            float[] dimensions =new float[]{400.0f,500.0f};

            addContentView(mContent, new FrameLayout.LayoutParams(
                    (int) (dimensions[0] * scale + 0.5f),
                    (int) (dimensions[1] * scale + 0.5f)));

            FrameLayout.LayoutParams FILL =
                new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
                                 ViewGroup.LayoutParams.FILL_PARENT);
            WebView mWebView = new WebView(context);
            mWebView.setVerticalScrollBarEnabled(false);
            mWebView.setHorizontalScrollBarEnabled(false);
            mWebView.setWebViewClient(new WebClicent());
            mWebView.getSettings().setJavaScriptEnabled(true);
            mWebView.loadUrl(url);
            mWebView.setLayoutParams(FILL);
            mContent.addView(mWebView);

            TwitterDialog.this.show();
        }

         class WebClicent extends WebViewClient{

            @Override
            public void onLoadResource(WebView view, String url) {
                System.out.println("onLoadResource "+url);
                super.onLoadResource(view, url);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                System.out.println("onPageFinished "+url);
                                    //TwitterDialog.this.dismiss();
                super.onPageFinished(view, url);
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                System.out.println("onPageStarted "+url);
                super.onPageStarted(view, url, favicon);
            }

         }
  }//TWitterDialog
0 голосов
/ 25 октября 2011

Причина, по которой ваша клавиатура может не отображаться, возможно, связана с тем, что вы используете устройство с жесткой клавиатурой. ЛЮБОМУ УСТРОЙСТВУ С ФИЗИЧЕСКОЙ КЛАВИАТУРОЙ не нужно показывать программную клавиатуру ... Вот почему она не отображается. Потому что ваше устройство или ваш эмулятор имеет физическую жесткую клавиатуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...