Вызовите метод MainActivity из другого класса в Android - PullRequest
0 голосов
/ 24 января 2019

Я работаю над приложением для Android.Я хочу передать значение из моего webview в мое приложение для Android.

Я успешно решил эту проблему, используя решение, приведенное в Передача данных из класса Java в Web View html .

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь вызвать MainActivity методы из JavaScriptInterface.java, методы не вызываются или не выдаются ошибки.

вот чтоЯ пробовал до сих пор:

MainActivity act=new MainActivity();
act.myMethod() //This method is available in my activity

но он не вызывается.

и

((MainActivity)getActivity).myMethod();

    public class MainActivity extends AppCompatActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.AppTheme);
        setContentView(R.layout.activity_main);
    }
    public void myMethod() {
        Toast.makeText(this, "Inside MainActivity", Toast.LENGTH_SHORT).show();
    }
}

//JavaScriptInterface class

    class JavaScriptInterface {
    Context mContext;

    JavaScriptInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void onButtonClick(String toast1, String toast2) {
        Toast.makeText(mContext, toast1+" | "+toast2, Toast.LENGTH_SHORT).show(); //THIS IS WORKING
        MainActivity act=new MainActivity();
        act.myMethod(); //NOT WORKING
    }
}

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы создаете еще один объект MainActivity, поэтому он не отображается. Вы передаете контекст действия интерфейсу, чтобы вы могли просто

((MainActivity)mContext).myMethod();

Пример MainActivity

public class MainActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView myWebView = findViewById(R.id.webview);
    myWebView.loadUrl("http://www.google.com");
    myWebView.addJavascriptInterface(new WebAppInterface(this), "Android");
}

public void myMethod(String test){
    Toast.makeText(this, test, Toast.LENGTH_SHORT).show();

}

public class WebAppInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    WebAppInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        ((MainActivity)mContext).myMethod("hello");
    }
}

}

Более подробную информацию можно найти в документации Android

0 голосов
/ 24 января 2019

Технически, будет вызван myMethod, но поскольку вы сами создаете MainActivity, он ни к чему не привязан.

Как правило, вы не должны создавать новый экземпляр MainActivity таким образом. Чтобы открыть новый MainActivity, вы используете Intent.

В вашем случае вы должны иметь ссылку на исходный экземпляр MainActivity и вызывать этот метод там. Не создавайте новый каким-либо образом, так как он уже запущен.

Простой способ решить:

MainActivity.this.myMethod("Hello there")

Вам не нужно хранить mContext. Вы уже находитесь в MainActivity.

Итак, полный код будет:

public class MainActivity extends AppCompatActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView myWebView = findViewById(R.id.webview);
    myWebView.loadUrl("http://www.google.com");
    myWebView.addJavascriptInterface(new WebAppInterface(), "Android");
}

public void myMethod(String test){
    Toast.makeText(this, test, Toast.LENGTH_SHORT).show();

}

public class WebAppInterface {

    /** Show a toast from the web page */
    @JavascriptInterface
    public void showToast(String toast) {
        MainActivity.this.myMethod("Hello there");
    }
}

}

На самом деле, я думаю, что вы даже можете избежать MainActivity.this. и позвонить myMethod напрямую.

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