【问题标题】:calling intent WebView in fragment在片段中调用意图 WebView
【发布时间】:2018-03-25 19:06:43
【问题描述】:

嗨,我正在尝试在单击 recyclerview 项目时调用 webview 片段,我用它的 webview 布局制作了一个片段,我有一个适配器来调用该片段,但它关闭了 APP:

public class WebViewFragment extends Fragment {

    public WebView mWebView;


    public WebViewFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        mWebView = (WebView) mWebView.findViewById(R.id.webview);
        mWebView.loadUrl("google.com");

        // Enable Javascript
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        // Force links and redirects to open in the WebView instead of in a browser
        mWebView.setWebViewClient(new WebViewClient());

        return inflater.inflate(R.layout.fragment_web_view, container, false);
    }

}

还有适配器:

@Override
    public void onClick(View view) {
        int position = (int) view.getTag();
        News news =newsItems.get(position);
        Uri uri = Uri.parse(news.getLink());
        Intent intent = new Intent(mACtivity, WebViewFragment.class);
        mACtivity.startActivity(intent);

    }

布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="tech.amro.amro.WebViewFragment">

    <!-- TODO: Update blank fragment layout -->

    <WebView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/webview"/>

</FrameLayout>

我知道我还没有将 url 发送到 webview,但我只是在测试先加载视图然后发送 url。但是当单击该项目时,它会关闭 APP。并给出这个错误:

D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: tech.amro.amro, PID: 18958
                  android.content.ActivityNotFoundException: Unable to find explicit activity class {tech.amro.amro/tech.amro.amro.WebViewFragment}; have you declared this activity in your AndroidManifest.xml?
                      at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1932)
                      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1615)
                      at android.app.Activity.startActivityForResult(Activity.java:4472)
                      at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
                      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:67)
                      at android.app.Activity.startActivityForResult(Activity.java:4430)
                      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:720)
                      at android.app.Activity.startActivity(Activity.java:4791)
                      at android.app.Activity.startActivity(Activity.java:4759)
                      at tech.amro.amro.adapters.NewsAdapter.onClick(NewsAdapter.java:73)
                      at android.view.View.performClick(View.java:6256)
                      at android.view.View$PerformClick.run(View.java:24701)
                      at android.os.Handler.handleCallback(Handler.java:789)
                      at android.os.Handler.dispatchMessage(Handler.java:98)
                      at android.os.Looper.loop(Looper.java:164)
                      at android.app.ActivityThread.main(ActivityThread.java:6541)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Application terminated.

【问题讨论】:

  • 来自 logcat 的共享错误。 Intent 意图 = new Intent(mACtivity, WebViewFragment.class); WebViewFragment - 应该扩展活动,而不是片段
  • @user5599807 添加了错误。
  • 您需要从活动扩展并在清单中声明活动:developer.android.com/training/basics/firstapp/…
  • @user5599807 但这不是活动,而是片段。
  • 您不能使用 startActivity() 调用片段,因为这种方式仅适用于活动。所以你需要从活动扩展(检查我在之前评论中提供的链接)或以这种方式使用片段:developer.android.com/guide/components/fragments.html

标签: android android-fragments android-intent webview


【解决方案1】:

如果您没有使用 WebView 的特定原因,您可以使用 Intent 来启动 Web 浏览器,如下所示。

@Override
public void onClick(View view) {
    int position = (int) view.getTag();
    News news = newsItems.get(position);
    Intent i = new Intent(Intent.ACTION_VIEW);
    i.setData(Uri.parse(news.getLink()));
    startActivity(i);
}

请注意,您可能需要检查设备是否可以处理 URI - 有些人可能没有安装浏览器,这会导致 ActivityNotFoundException。

如果您确实需要使用 WebView,您会遇到几个问题:

Fragment 不能以启动 Activity 的方式启动,要显示 Fragment,您需要使用 FragmentManager 将其添加到 Activity 中。

关于您的片段,onCreateView 代码将不起作用。您需要先膨胀包含您的 webview 的 xml,然后从该布局中找到 webview。 目前您正试图从 webView 中找到 webView,这将导致 NullPointerException。 您还应该更喜欢 onViewCreated 来查找和加载 WebView url。

您的片段应该如下所示

public class WebViewFragment extends Fragment {

    private static final String NEWS_LINK_KEY = "NEWS_LINK";
    private String newsLink;

    public static WebViewFragment newInstance(String uri) {
        Bundle args = new Bundle();
        args.putString(NEWS_LINK_KEY, uri);
        WebViewFragment webViewFragment = new WebViewFragment();
        webViewFragment.setArguments(args);
        return webViewFragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        newsLink = this.getArguments().getString(NEWS_LINK_KEY);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.web_view, container, false)
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        WebView webView = (WebView) view.findViewById(R.id.webview);

        // Enable Javascript
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        // Force links and redirects to open in the WebView instead of in a browser
        webView.setWebViewClient(new WebViewClient());

        webView.loadUrl(newsLink);
    }
}

这可以从 onClick 方法开始,如下所示:

@Override
public void onClick(View view) {
    int position = (int) view.getTag();
    News news = newsItems.get(position);
    getSupportFragmentManager().beginTransaction()
            .add(android.R.id.content, WebViewFragment.newInstance(news.getLink()))
            .commit();
}

【讨论】:

  • 感谢您的回复,现在我在适配器类中不支持“getSupportFragmentManager()”。对于浏览器,我的应用程序在浏览器上运行良好,就像您添加的代码一样。但我想改进我的应用程序并打开我的应用程序中的链接。再次感谢。
  • 您可能有一些关于如何从适配器启动片段的选项 - 通常您会将点击侦听器委托给活动,然后该活动可以决定做什么 - 创建一个片段在这种情况下。
  • 或者,如果您不需要 Fragment,您可以按照上面的建议将 WebViewFragment 更改为从 Activity 扩展。
  • 再次感谢,现在我得到了这样的支持:WebViewFragment webViewFragment = WebViewFragment.newInstance(news.getLink()); int fragmentTransaction = ((AppCompatActivity)mACtivity).getSupportFragmentManager().beginTransaction() .add(android.R.id.content, WebViewFragment.newInstance(news.getLink())) .commit(); 但现在 webview 占据了整个屏幕,而不是在我的应用程序的框架内。
  • 那是因为你正在使用:android.R.id.content - 如果你不想填满屏幕,你需要在 webView 可以存在的活动布局中创建一个视图,例如类似于 FrameLayout - 然后您可以将 android.R.id.content 替换为容器的 id。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多