Как сфокусировать <WebView>на реакции родного? - PullRequest
0 голосов
/ 25 апреля 2018

Я ищу способ автоматической фокусировки поля ввода / текстового поля ИЛИ вызвать нажатие внутри WebView компонента в React Native. Цель автофокуса - убедиться, что клавиатура сразу всплывает ...

У кого-нибудь есть идеи? Полезны также советы по открытию или закрытию клавиатуры ...

Я также подал вопрос здесь: https://github.com/facebook/react-native/issues/18965

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

ОБНОВЛЕНИЕ : С тех пор, как я это опубликовал, кто-то создал этот модуль с автофокусом: https://github.com/TryImpossible/react-native-enhance-webview (для решения 2)


После небольшого исследования Я вижу 2 решения для этого.

  1. Fork React Native и настройка компонента WebView.

Следующие изменения для фокусировки на WebView должны быть применены к https://github.com/facebook/react-native/blob/6e359c4589b0627de59332ce56fe28804425a609/ReactAndroid/src/main/java/com/facebook/react/views/webview/ReactWebViewManager.java#L545

    view.loadUrl(url, headerMap);
    view.requestFocus();
    return;

Добавленный view.requestFocus (); даст фокус WebView. После этого в WebView вам нужно вызвать .focus() для некоторого элемента HTML.

  1. Второе решение - написать собственный нативный компонент на основе WebView, это более простое решение, потому что разветвление и перестройка React Native - это немного работы ...

Лучшие ресурсы, которые помогут с этим решением, - следовать этим двум статьям:

https://lakshinkarunaratne.wordpress.com/2018/01/22/enhancing-the-react-native-webview-part-1-supporting-file-uploads-in-ios-android/

https://lakshinkarunaratne.wordpress.com/2018/03/11/enhancing-the-react-native-webview-part-2-supporting-file-downloads-in-android/

Самый важный файл в нативном компоненте - AdvancedWebviewManager.java. Там вы можете переопределить или определить новый source метод, который будет вызывать .requestFocus() после загрузки URL:

package your.package.advancedwebview;

import android.webkit.WebView;

import javax.annotation.Nullable;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableMapKeySetIterator;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.views.webview.ReactWebViewManager;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Locale;

public class AdvancedWebviewManager extends ReactWebViewManager {
    public WebView webview = null;

    public static final String REACT_CLASS = "AdvancedWebview";

    private AdvancedWebviewPackage aPackage;
    public String getName() {
        return REACT_CLASS;
    }

    @ReactProp(name = "sourceFocus")
    public void setSource(WebView view, @Nullable ReadableMap source) {
        if (source != null) {
            if (source.hasKey("html")) {
                String html = source.getString("html");
                if (source.hasKey("baseUrl")) {
                    view.loadDataWithBaseURL(
                            source.getString("baseUrl"), html, HTML_MIME_TYPE, HTML_ENCODING, null);
                } else {
                    view.loadData(html, HTML_MIME_TYPE, HTML_ENCODING);
                }
                return;
            }
            if (source.hasKey("uri")) {
                String url = source.getString("uri");
                String focusKeyboard = source.getString("focusKeyboard");
                String previousUrl = view.getUrl();
                if (previousUrl != null && previousUrl.equals(url)) {
                    return;
                }
                if (source.hasKey("method")) {
                    String method = source.getString("method");
                    if (method.equals(HTTP_METHOD_POST)) {
                        byte[] postData = null;
                        if (source.hasKey("body")) {
                            String body = source.getString("body");
                            try {
                                postData = body.getBytes("UTF-8");
                            } catch (UnsupportedEncodingException e) {
                                postData = body.getBytes();
                            }
                        }
                        if (postData == null) {
                            postData = new byte[0];
                        }
                        view.postUrl(url, postData);
                        return;
                    }
                }
                HashMap<String, String> headerMap = new HashMap<>();
                if (source.hasKey("headers")) {
                    ReadableMap headers = source.getMap("headers");
                    ReadableMapKeySetIterator iter = headers.keySetIterator();
                    while (iter.hasNextKey()) {
                        String key = iter.nextKey();
                        if ("user-agent".equals(key.toLowerCase(Locale.ENGLISH))) {
                            if (view.getSettings() != null) {
                                view.getSettings().setUserAgentString(headers.getString(key));
                            }
                        } else {
                            headerMap.put(key, headers.getString(key));
                        }
                    }
                }
                view.loadUrl(url, headerMap);
                if (focusKeyboard.equals("focus")) {
                    view.requestFocus();
                }
                return;
            }
        }
        view.loadUrl(BLANK_URL);
    }


    public void setPackage(AdvancedWebviewPackage aPackage){
        this.aPackage = aPackage;
    }

    public AdvancedWebviewPackage getPackage(){
        return this.aPackage;
    }
}

Это в основном копирует и расширяет файл ReactWebViewManager.java из: https://github.com/facebook/react-native/blob/6e359c4589b0627de59332ce56fe28804425a609/ReactAndroid/src/main/java/com/facebook/react/views/webview/ReactWebViewManager.java#L545

0 голосов
/ 02 мая 2018

См. https://facebook.github.io/react-native/docs/webview.html#injectedjavascript

Вы можете выполнить любой javascript на странице WebView.

let injectScript = `document.querySelector('#myInput').focus();`;

<WebView
        injectedJavaScript={injectScript}
        source={{uri:"XXX"}}
        startInLoadingState
      />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...