简体   繁体   中英

Referencing a class button action inside another class

I have a voice input class that works absolutely great. However, I want the user of my app to be able to use voice input code on any page of the app. What I need to do is have a button set up on every xml that allows me to use my voice input code without having to copy all of my voice input code into every single class. How do I reference my code so I can simply have something in my code that says if I press this button it does the activity in another class? The code in order as follows is, voiceinput code java class, java class that I want to be able to have a button that uses this code.

package com.example.com.proto1;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

/**
 * Sample code that invokes the speech recognition intent API.
 */
public class VoiceRecognition extends Activity implements OnClickListener {



    public static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;

    public ListView mList;
    public Button speakButton;

    /**
     * Called with the activity is first created.
     */
    @Override
    public void onCreate(Bundle voiceinput) {
        super.onCreate(voiceinput);

        // Inflate our UI from its XML layout description.
        setContentView(R.layout.voice_recognition);

        // Get display items for later interaction

        voiceinputbuttons();


        // Check to see if a recognition activity is present
        PackageManager pm = getPackageManager();
        List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(
                RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
        if (activities.size() != 0) {
            speakButton.setOnClickListener(this);
        } else {
            speakButton.setEnabled(false);
            speakButton.setText("Recognizer not present");
        }
    }

    public void voiceinputbuttons() {
        // TODO Auto-generated method stub
        speakButton = (Button) findViewById(R.id.btn_speak);
        mList = (ListView) findViewById(R.id.list);
    }

    /**
     * Handle the click on the start recognition button.
     */
    public void onClick(View v) {
        if (v.getId() == R.id.btn_speak) {
            startVoiceRecognitionActivity();
        }
    }

    /**
     * Fire an intent to start the speech recognition activity.
     */
    public void startVoiceRecognitionActivity() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                "Speech recognition demo");
        startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
    }

    /**
     * Handle the results from the recognition activity.
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == VOICE_RECOGNITION_REQUEST_CODE
                && resultCode == RESULT_OK) {
            // Fill the list view with the strings the recognizer thought it
            // could have heard
            ArrayList<String> matches = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            mList.setAdapter(new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, matches));
            //matches is the result of voice input. It is a list of what the user possibly said.
            //Using an if statement for the keyword you want to use allows the use of any activity if keywords match
            //it is possible to set up multiple keywords to use the same activity so more than one word will allow the user 
            //to use the activity (makes it so the user doesn't have to memorize words from a list)
            //to use an activity from the voice input information simply use the following format;
            //if (matches.contains("keyword(s) here") {  startActivity(new Intent("name.of.manifest.ACTIVITY")

            if (matches.contains("information")) {
                startActivity(new Intent("android.intent.action.INFOSCREEN"));
            }

            if (matches.contains("home")) {
                startActivity(new Intent("android.intent.action.MENU"));
            }

        }

        super.onActivityResult(requestCode, resultCode, data);

    }
}











package com.example.com.proto1;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.speech.RecognizerIntent;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.speech.tts.TextToSpeech;
import java.util.ArrayList;
import java.util.List;

public class menu extends Activity implements TextToSpeech.OnInitListener {

    MediaPlayer sep, aep, vpm;

    TextToSpeech mTts;

    public void onInit(int i) {
        // TODO Auto-generated method stub
        mTts.speak("EyePhone Main Menu", TextToSpeech.QUEUE_FLUSH, null);

    }

    @Override
    protected void onCreate(Bundle aboutmenu) {
        // TODO Auto-generated method stub
        super.onCreate(aboutmenu);
        setContentView(R.layout.mainx);


        // Setting up the button references
        Button info = (Button) findViewById(R.id.aboutbutton);
        Button voice = (Button) findViewById(R.id.voicebutton);
        Button speakButton = (Button) findViewById(R.id.btn_speak);

        info.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                startActivity(new Intent("android.intent.action.INFOSCREEN"));

            }
        });

        voice.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {
                    Intent voiceIntent = new Intent(
                            "android.intent.action.RECOGNITIONMENU");
                    startActivity(voiceIntent);
                } catch (Exception e) {

                }
            }
        });

        speakButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                try {

                    //this is the place where I thought the code should go that I am asking about

                } catch (Exception e) {

                }
            }

        });

    }

}

Define a STATIC method in a new class file (lets say TTSHelper ) which takes Activity reference as parameter (and others if required). Now call this static method from the onClick method of your button. Doing so will allow you not to repeat the code in each activity class.

Define as:

public class TTSHelper {
    public static void myMethod(Activity activity){
        //do whatever you want
    }
}

Use as:

public void onClick(View v) {
    TTSHelper.meMethod(this);
}

PS You may replace reference of Activity with Context as a parameter to your static method, but then you should be aware of which context reference you need to pass (activity/application).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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