在android中使用webview将CSS注入到网站

2023-12-02

例如我想改变背景颜色www.google.comto red。 我用过webview, 和我的style.css文件位于assest folder。我想注入这个style.css文件至www.google.com。我的代码有什么问题吗?请为我写出正确的代码。谢谢。 我的MainActitviy.java file :

package com.example.mysina;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebView;

public class MainActivity extends ActionBarActivity {


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            WebView webView = new WebView(this);

            setContentView(webView);

                    String html = "<html><head><style> src: url('file:///android_asset/style.css')</style></head></html>";

                    webView.loadData(html, "text/html", "utf-8");
                    webView.loadUrl("https://www.google.com");
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

你不能直接注入 CSS,但是你可以使用 Javascript 来操作页面 dom。

public class MainActivity extends ActionBarActivity {

  WebView webView;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    webView = new WebView(this);
    setContentView(webView);

    // Enable Javascript
    webView.getSettings().setJavaScriptEnabled(true);

    // Add a WebViewClient
    webView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageFinished(WebView view, String url) {

            // Inject CSS when page is done loading
            injectCSS();
            super.onPageFinished(view, url);
        }
    });

    // Load a webpage
    webView.loadUrl("https://www.google.com");
}

// Inject CSS method: read style.css from assets folder
// Append stylesheet to document head
private void injectCSS() {
    try {
        InputStream inputStream = getAssets().open("style.css");
        byte[] buffer = new byte[inputStream.available()];
        inputStream.read(buffer);
        inputStream.close();
        String encoded = Base64.encodeToString(buffer, Base64.NO_WRAP);
        webView.loadUrl("javascript:(function() {" +
                "var parent = document.getElementsByTagName('head').item(0);" +
                "var style = document.createElement('style');" +
                "style.type = 'text/css';" +
                // Tell the browser to BASE64-decode the string into your script !!!
                "style.innerHTML = window.atob('" + encoded + "');" +
                "parent.appendChild(style)" +
                "})()");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在android中使用webview将CSS注入到网站 的相关文章

随机推荐

  • 在 Foreach 循环中递增变量并使用它-SSIS

    我有一个包 我正在使用 foreach 循环来循环数据库 我正在传递一个字符串 它会循环遍历所有数据库 到这里一切都很完美 我想要实现的是 对于它循环的每个数据库 它应该将变量增加 1 假设我必须循环遍历总共 5 个数据库 包级变量 myv
  • 等待 Firebase 检索数据[重复]

    这个问题在这里已经有答案了 我想构建一个返回a的方法childFirebase 中的值 我尝试做这样的事情 public String getMessage root child MessagesOnLaunch child Message
  • 通过RedBean批量插入mysql

    如何运行以下sqlRedBean INSERT INTO tbl name a b c VALUES 1 2 3 4 5 6 7 8 9 我应该使用循环还是RedBean支持批量插入 RedBeanPHP 的创建者在这里 RedBeanPH
  • 在 Adob​​e AIR for iOS 中获取唯一标识符(MAC 地址、UDID 等)

    我正在尝试在适用于 Android 和 iOS iPad 2 的 Adob e AIR 应用程序中获取用户设备网络适配器的 MAC 地址 在 Android 中它可以正常工作 但在 iOS 中却不能 这是我正在使用的代码 var vNetw
  • 从unittest.TestCase切换到tf.test.TestCase后的幻像测试

    以下代码 class BoxListOpsTest unittest TestCase Tests for common bounding box operations
  • Sparklyr:如何将列表列分解为 Spark 表中自己的列?

    我的问题与中的问题类似here 但我在实现答案时遇到问题 并且我无法在该线程中发表评论 因此 我有一个包含嵌套数据的大 CSV 文件 其中包含由空格分隔的 2 列 假设第一列是 Y 第二列是 X X 列本身也是一个逗号分隔值 21 66 2
  • OS X Yosemite 中 setenv 和 getenv 的奇怪行为

    当我设置环境变量时 launchctl setenv FOO test 我可以通过以下方式获取值 launchctl getenv FOO 这返回我 测试 但是一个简单的 echo FOO 不替换 结果为空 在同一航站楼以及新航站楼中 背景
  • 全局变量被炼金术打破了?

    看起来Adobe炼金术没有运行全局构造函数 这是一些简单的测试代码 include
  • 更改通过 JsonExtensionData 加载的数据的键名称[重复]

    这个问题在这里已经有答案了 我有一个由系统数据和用户条目混合而成的 JSON 如下所示 Properties Type A Name aaa lorem ipsum 7 1 Type B Name bbb sit amet XYZ Type
  • 根据文件扩展名验证文件

    我从 Java 队列中获取文件 它们可能具有以下格式 docx pdf doc xls xlsx txt rtf 阅读它们的扩展名后 我想验证它们是否确实是这些类型的文件 例如 我收到一个文件并检查其扩展名是否为 xls 之后 我想检查它是
  • 在打印机兼容的设备上下文中调用 Windows SelectObject 返回 NULL

    最近的 Windows 10 更新 可能也是神秘的 KB4577586 似乎已经产生了引起调用的效果选择对象使用位图句柄作为参数 在打印机兼容的设备上下文中执行时返回 NULL 相关行可以在这个中看到位图打印示例 它在早期的 Windows
  • 从字节码解析类名

    是否可以从类源代码形成的字节码中挖掘类名称 情况是这样的 我从某个地方远程获取类字节码 它来自哪里并不重要 为了使用类加载器有效地加载该类 我还需要类名 对吗 如果您只需要类名 那么您自己解析类文件的开头可能会更容易 而不是为此目的添加用于
  • R 语言:使用 ff 包计算“group by”或拆分时出现问题

    我对 R 几乎是新手 很抱歉如果我提出一些基本问题 但我找不到这个 简单 问题的解决方案 我有一个患者数据库 大数据库 2500 万行 14 列 每个 id 有几行 例如以下结构 id birth date treatment date t
  • processing.js 加载外部文件

    我想将我的processing js 代码分割成几个文件 但我不知道如何分割 我尝试做
  • Flow Router 不适用于 ObjectID。有什么解决办法吗?

    我正在尝试在我的 Meteor 应用程序中构建路线 路由工作得很好 但使用路由路径从数据库获取信息却不起作用 我用这个创建我的页面特定路线 FlowRouter route level id 这条路线将我毫无问题地带到相关模板 然后我想从数
  • 位图区域已被锁定,多线程环境

    我正在使用一个通过多个线程调用主函数的 API 我试图通过该函数访问另一个类中的位图并从中写入 但即使将其设置为使用完全不同的对象实例后 我也遇到了 InvalidOperationException 位图区域已被锁定 我尝试在主函数和调用
  • 相当于 Office-js Excel 加载项中的 Application.ScreenUpdating 属性

    我正在将大量数据插入工作表中 这样做时屏幕会闪烁 在 VBA 和 com 加载项中 我可以设置一个属性来延迟更新 直到更新完成 Office js excel 加载项中是否有与 Application ScreenUpdating 属性等效
  • 如何在flutter中获得像facebook一样的微光效果?

    我正在尝试创建一个视频流应用程序并想要像 facebook 那样的微光效果 有什么建议如何获得它吗 微光 1 0 1 开启https pub dev packages shimmer 一个包提供了在Flutter项目中添加微光效果的简单方法
  • didSelectViewController 在某些情况下不会被调用

    我遇到了很多人已经报告过的问题 didSelectViewController不会被调用 但就我而言 有时会被调用 我有三个选项卡和三个视图控制器 每次用户按下第二个或第三个选项卡时 我都需要执行一些代码 在我的 SecondViewCon
  • 在android中使用webview将CSS注入到网站

    例如我想改变背景颜色www google comto red 我用过webview 和我的style css文件位于assest folder 我想注入这个style css文件至www google com 我的代码有什么问题吗 请为我写