android - 当我声明我的按钮时,应用程序停止并且无法打开

标签 android button crash

当我声明并尝试获取对我在 XML 中声明的按钮的引用时,应用程序将无法打开,我不知道为什么。请尝试向我解释为什么不 - 不要只提供链接。

这是代码:

public class MainActivity extends AppCompatActivity {
final String stream="<iframe width=\"300\" height=\"193\" src=\"http://cdn.livestream.com/embed/sl48?layout=4&color=0xffad4b&autoPlay=true&mute=false&iconColorOver=0xe17b00&iconColor=0xb96500&allowchat=true&height=193&width=300\" style=\"border:0;outline:0\" frameborder=\"0\" scrolling=\"no\"></iframe>";
 // Button button = (Button) findViewById(R.id.home);
//final Button button1 = (Button) findViewById(R.id.stream);
//final Button button2 = (Button) findViewById(R.id.contatti);

WebView custumWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    custumWebView = (WebView) findViewById(R.id.webView);
    custumWebView.loadData(stream, "text/html", null);
    custumWebView.getSettings().setJavaScriptEnabled(true);
    custumWebView.getSettings().setLoadsImagesAutomatically(true);
    custumWebView.clearHistory();
    custumWebView.clearCache(true);
    custumWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
}

public class CustomWebView extends WebView {
    public CustomWebView (Context context) {
        super( context );
        init();
    }

    public CustomWebView (Context context, AttributeSet attrs) {
        super( context, attrs );
        init();
    }

    public CustomWebView (Context context, AttributeSet attrs, int defStyle) {
        super( context, attrs, defStyle );
        init();
    }

    public CustomWebView (Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) {
        super( context, attrs, defStyle, privateBrowsing );
        init();
    }

    protected void init () {
        getSettings().setJavaScriptEnabled( true );
        setWebViewClient( new CustomWebViewClient() );
        setDownloadListener( new CustomDownloadListener() );
    }

    protected boolean overrideUrlLoading (WebView view, String url) {
        // ANY CUSTOM LOGIC GOES HERE

        view.loadUrl(url);

        return true;
    }

    protected void pageFinished (WebView view, String url) {
    }

    protected void downloadStarted(String url, String mimetype) {
        try {
            //Start new activity to load the specific url
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.parse(url), mimetype);
            getContext().startActivity(intent);
            //custumWebView.loadData(stream, "text/html", null);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    /**
     * Default webview client.
     */
    protected class CustomWebViewClient extends WebViewClient {

        /**
         * Constructor, default.
         */
        public CustomWebViewClient () {

        }

        @Override
        public boolean shouldOverrideUrlLoading (WebView view, String url) {
            return overrideUrlLoading( view, url );
        }

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

    protected class CustomDownloadListener implements DownloadListener {
        public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
            downloadStarted(url, mimetype);
        }
    }
}

这里是xml
<RelativeLayout 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"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <WebView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/webView"
        android:layout_below="@+id/stream"
        android:layout_alignRight="@+id/stream"
        android:layout_alignEnd="@+id/stream"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_above="@+id/imageView" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Home"
        android:id="@+id/home"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="stream"
        android:id="@+id/stream"
        android:layout_alignTop="@+id/home"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Contatti"
        android:id="@+id/contatti"
        android:layout_above="@+id/webView"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:minHeight="50dp"
        android:minWidth="400dp" />
</RelativeLayout>
CustomWebView类是这样我不会得到 loadData 的错误对于流媒体网站。我不知道为什么这门课有效,但确实如此。我是从直播支持网站复制的,我只是一个新手,我正在努力学习。

最佳答案

如果您指的是类(class)顶部的这两行代码:

 // Button button = (Button) findViewById(R.id.home);
//final Button     //final Button button2 = (Button) findViewById(R.id.contatti);

不会工作在那个位置。这些按钮是在您的 XML 布局中创建的。在您 之前,您无法获得对在 XML 布局中声明的按钮的引用。第一个 调用setContentView()在您的 onCreate()方法。你 必须做这个。

这是你需要做的:
public class MainActivity extends AppCompatActivity {
    private Button mButton;
    private Button mButton1;
    private Button mButton2;

    // declare any other fields you require

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mButton = (Button) findViewById(R.id.home);     
    mButton1 = (Button) findViewById(R.id.stream);
    mButton2 = (Button) findViewById(R.id.contatti);

    // Your other initialization code
}

请注意,您不能声明这些 Buttonsfinal字段,因为它们没有在构造函数中实例化(onCreate() 不是构造函数)。

关于android - 当我声明我的按钮时,应用程序停止并且无法打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32011045/

相关文章:

android - GooglePlayServicesAvailable 何时返回 SERVICE_VERSION_UPDATE_REQUIRED?

wpf - 按钮的前景在属性触发器中没有改变

javascript - 在没有 length 属性的变量上使用 .length 会导致崩溃

c++ - 在加载文件函数中警告删除数组

安卓,Gradle : RetroLambda not working

Android 访问属性引用

android - 在 Android 中实现 fragment

android - 按钮上的奇怪异常

ios - 如何使用相同的工具栏按钮显示/隐藏搜索栏

android - Eclipse Android 应用程序崩溃