简体   繁体   English

蓝牙应用程序在按下按钮时崩溃

[英]Bluetooth app crashes on button press

I'm new to Android & was trying out the Bluetooth APIs of Google.我是 Android 新手,正在尝试 Google 的蓝牙 API。 Whenever I run my app on my phone, it crashes for some reason.每当我在手机上运行我的应用程序时,它都会出于某种原因崩溃。 I'm following the Google Developer's tutorial for the APIs & have made changes to my MainActivity.java & content.xml accordingly, but no use.我正在关注 API 的 Google 开发人员教程,并相应地对我的 MainActivity.java 和 content.xml 进行了更改,但没有用。 Please have a look.请看一看。

Here's my MainActivity.java这是我的MainActivity.java

import android.content.Intent;
import android.content.Context;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.bluetooth.*;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {

    private Button btn;

    private BluetoothAdapter BA = BluetoothAdapter.getDefaultAdapter();
    private int REQUEST_ENABLE_BT = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

       /* FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });*/
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void bluetoothDiscovery()
    {
     if(BA == null)
     {
         System.out.println("System Doesn't Support Bluetooth");
     }

     if(!BA.isEnabled())
     {
         Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
         startActivityForResult(enableBTIntent,REQUEST_ENABLE_BT);
         Toast.makeText(MainActivity.this,"Turned On!!", Toast.LENGTH_LONG).show();
     }
     else
     {
         Toast.makeText(MainActivity.this, "ALREADY ON", Toast.LENGTH_LONG).show();
     }


    }

}

Here's my AndroidManifest.xml这是我的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="vertex2016.mvjce.edu.bluetoothapptry">
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Here's my activity_main.xml这是我的activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="vertex2016.mvjce.edu.bluetoothapptry.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

  <!--  <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email"
        android:onClick="bluetoothDiscovery"/> -->

</android.support.design.widget.CoordinatorLayout>

Here's my content.xml这是我的content.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="vertex2016.mvjce.edu.bluetoothapptry.MainActivity"
    tools:showIn="@layout/activity_main">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="BTButton"
        android:id="@+id/button"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:onClick="bluetoothDiscovery"/>
</RelativeLayout>

And here's my logcat这是我的logcat

03-13 02:06:34.719 18759-18759/vertex2016.mvjce.edu.bluetoothapptry E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                      Process: vertex2016.mvjce.edu.bluetoothapptry, PID: 18759
                                                                                      java.lang.IllegalStateException: Could not find method bluetoothDiscovery(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'button'
                                                                                          at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:307)
                                                                                          at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:266)
                                                                                          at android.view.View.performClick(View.java:4789)
                                                                                          at android.view.View$PerformClick.run(View.java:19881)
                                                                                          at android.os.Handler.handleCallback(Handler.java:739)
                                                                                          at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                          at android.os.Looper.loop(Looper.java:135)
                                                                                          at android.app.ActivityThread.main(ActivityThread.java:5292)
                                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                                          at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
                                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

Thank you for your time感谢您的时间

Your method bluetoothDiscovery must accept a parameter of type View , see View.onClick for reference.您的方法bluetoothDiscovery必须接受View类型的参数,请参阅View.onClick以供参考。

public void bluetoothDiscovery(View v) {}

When this method is called, v will be the View object that was clicked.当这个方法被调用时, v将是被点击的 View 对象。

ie IE

switch ( v.getId() ) {
    case R.id.button:
        // do something
        break;
    case R.id.other_button
        // do something else
        break;
}

Where r.id.button comes from your definition in XML, r.id.button来自您在 XML 中的定义,

android:id="@+id/button"

It is using this, you could have a single onClick method that is called by multiple buttons, each one with their own action.使用它,您可以拥有一个由多个按钮调用的 onClick 方法,每个按钮都有自己的操作。

You need a View parameter in your onClick method您的 onClick 方法中需要一个 View 参数

public void bluetoothDiscovery(View v)

Personally, I try not to add onClick in the XML because they are hard to find as you add more classes and layouts.就我个人而言,我尽量不在 XML 中添加 onClick,因为当您添加更多类和布局时,它们很难找到。 You can just set the OnClickListener from the Java code for clearer visibility.您可以从 Java 代码中设置 OnClickListener 以获得更清晰的可见性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM