我不完全了解onClickListeners

时间:2016-03-12 22:22:50

标签: android anonymous-inner-class

因此,当我们将onClickListener设置为一个Button时,它看起来像这样。

private Button myButton = (Button) findViewById(R.id.my_button);

myButton.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View view){
        //do this
    }

});

因此,当我们声明新的View.OnClickListener ...并实现OnClickListener接口/并覆盖它的onClick方法时,我们正在创建一个无名的匿名类。我不明白的是,如果我们没有引用这个anon类,因为它是无名的,onClick()方法是如何被调用的?我只实现了一个匿名类来覆盖所述类中的某些方法,如下所示:

public class Foo{
    public void bar(){
        //do something
    }
}


Foo foo = new Foo(){
    @Override
    public void bar(){
        //do something else
    }
}

这对我来说非常有意义,因为现在,只要我使用“foo”引用调用bar()方法,该引用将使用重写版本的bar。对于Button,没有对onClick()的引用。我对此感到困惑。

3 个答案:

答案 0 :(得分:4)

如果它有助于您的理解,您可以改写:

View.OnClickListener listener = new View.OnClickListener(){
    @Override
    public void onClick(View view){
        //do this
    }
};
myButton.setOnClickListener(listener);

该按钮在侦听器超出范围后保存引用,并且可以在保持的侦听器对象上调用onClick回调。

答案 1 :(得分:1)

  

我不明白,如果我们没有引用这个anon类,因为它是无名的,onClick()方法是如何被调用的?

<?php set_time_limit(0); ini_set('memory_limit', '256M'); $description = $_POST['languages']; //enabline a file to be displayed as HTML for download start $filename = basename( $_FILES["file"]["name"]); header('Content-disposition: attachment; filename=' .$filename.'.html'); header('Content-type: text/html;charset=utf-8'); //enabline a file to be displayed as HTML for download end //writting javascript functions to run text to speech on word click start echo("<!DOCTYPE html><html>"); echo("<head><META HTTP-EQUIV='content-type' CONTENT='text/html; charset=utf-8'><title>".$filename."</title>"); echo("<script>"); echo("function speakIt(b)"); echo("{"); echo("if (document.getElementById(\"myCheck\").checked){"); echo("if ('speechSynthesis' in window){"); echo("var sometext=b;"); echo("var msg = new SpeechSynthesisUtterance();"); echo("var voices = window.speechSynthesis.getVoices();"); echo("msg.text = sometext;"); $textToSpeech = explode ("-",$description); $languageCode = ""; switch ($textToSpeech[0]) { case "de"://German $languageCode = "de-DE"; break; case "en"://English $languageCode = "en-GB"; break; case "es"://Spanish $languageCode = "es-ES"; break; case "fr"://French $languageCode = "fr-FR"; break; case "ru"://Russian $languageCode = "ru"; break; case "pt"://Portuguese - Portugal $languageCode = "pt-PT"; break; case "sr"://Serbian $languageCode = "sr-SP"; break; case "ja"://Japanese $languageCode = "ja"; break; case "he"://Hebrew $languageCode = "he"; break; case "it"://Italian - Italy $languageCode = "it-IT"; break; case "el"://Greek $languageCode = "el"; break; case "zh"://Chinese - China $languageCode = "zh-CN"; break; case "ar"://Arabic - Egypt $languageCode = "ar-EG"; break; case "hy"://Armenian $languageCode = "hy"; break; case "eu"://Basque $languageCode = "eu"; break; case "be"://Belarusian $languageCode = "be"; break; case "cs"://Czech $languageCode = "cs"; break; case "da"://Danish $languageCode = "da"; break; case "et"://Estonian $languageCode = "et"; break; case "mk"://FYRO Macedonia $languageCode = "mk"; break; case "hu"://Hungarian $languageCode = "hu"; break; case "is"://Icelandic $languageCode = "is"; break; case "hi"://Hindi $languageCode = "hi"; break; case "id"://Indonesian $languageCode = "id"; break; case "kk"://Kazakh $languageCode = "kk"; break; case "ko"://Korean $languageCode = "ko"; break; case "lv"://Latvian $languageCode = "lv"; break; case "lt"://Lithuanian $languageCode = "lt"; break; case "pl"://Polish $languageCode = "pl"; break; case "sk"://Slovak $languageCode = "sk"; break; case "sl"://Slovenian $languageCode = "sl"; break; case "sv"://Swedish - Sweden $languageCode = "sv-SE"; break; case "tr"://Turkish $languageCode = "tr"; break; case "uk"://Ukrainian $languageCode = "uk"; break; case "vi"://Vietnamese $languageCode = "vi"; break; //...add more language support default: $languageCode = "de-DE"; } echo("msg.lang = '".$languageCode."';"); //echo("alert(a);"); echo("speechSynthesis.speak(msg);"); echo("}"); echo("}"); echo("}"); echo("</script>"); echo(" <style> "); echo("#ebook {"); echo(" margin: auto;"); echo("width: 90%;font-size: 200%;@page {counter-increment: page;counter-reset: page 1;@top-right {content: \"Page \" counter(page) \" of \" counter(pages);}}"); echo("text-align: left;line-height:1.5;font-family: 'Merriweather', Georgia, 'Times New Roman', Times, serif;"); echo("vertical-align: middle;"); echo("word-wrap: break-word;"); echo("border:3px solid #8AC007;"); echo("padding: 10px;"); echo("}"); echo("#header-wrap {"); echo("position: fixed;"); echo("text-align: center;"); echo("background-color: #8AC007;"); echo("color: white;"); echo("height: 25px;"); echo("top: 0;"); echo("width: 100%;"); echo("z-index: 100;"); echo("}"); echo("</style>"); echo("</head><body>"); echo("<div id='header-wrap'>"); echo("<span>ENABLE / DISABLE TEXT TO SPEECH : <input type=\"checkbox\" name=\"myCheck\" id=\"myCheck\" checked=\"checked\"></span></br></br>"); echo("</div>"); echo("</br>"); echo("<div id='ebook'>"); echo("</br>"); //writting javascript functions to run text to speech on word click end //chech the details of the uploaded file start $uploadOk = 1; $imageFileType = pathinfo($filename,PATHINFO_EXTENSION); // Check if image file is a actual image or fake image // Check file size if ($_FILES["file"]["size"] > 500000) { echo "Sorry, your file is too large."; $uploadOk = 0; } // Allow certain file formats if($imageFileType != "txt" && $imageFileType != "pdf" ) { echo "Sorry, only .txt, .pdf files are allowed."; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { echo "Sorry, your file was not uploaded."; // if everything is ok, try to upload file } //chech the details of the uploaded file end //setup database connection start $servername = "localhost"; $username = "root"; $password = ""; $dbname = "dictionary"; $conn = new mysqli($servername, $username, $password, $dbname); $table_name=str_replace("-","to",$description); //setup database connection end //processing the data start $handle = fopen($_FILES["file"]["tmp_name"], "r"); if ($handle) { while (($line = fgets($handle)) !== false) { $words=explode(" ",$line); foreach ($words as $value) { $translated_word=" "; $callWorf=str_replace(".", "",$value); $callWorf=str_replace(",", "",$callWorf); $callWorf=str_replace("!", "",$callWorf); $callWorf=str_replace("?", "",$callWorf); $callWorf=str_replace("-", "",$callWorf); $callWorf=str_replace("ß", "ss",$callWorf); $callWorf=str_replace(":", "", $callWorf); $callWorf=str_replace(";", "", $callWorf); $callWorf=str_replace("\"", "", $callWorf); $callWorf=str_replace("»", "", $callWorf); $callWorf=str_replace("«", "", $callWorf); $callWorf=str_replace("..", "",$callWorf); $callWorf=str_replace("\n", "",$callWorf); $callWorf=trim($callWorf); $sql = "select translated FROM ".$table_name." where native='".$value."' limit 1;"; //echo $sql; $result = mysqli_query($conn, $sql); // output data of each row while($row = mysqli_fetch_array($result)) { $translated_word=$row["translated"]; //THIS IS WHERE I FAIL TO GET RESULTS ALTHOUGH WHEN I RUN THE STANDALONE QUERY IN WORKS FINE } echo "<span onclick=\"alert('".$translated_word."');speakIt('".$callWorf."'); \" >".$value." </span>"; } echo '</br>'; } fclose($handle); } //processing the data end mysqli_close($conn); echo("</div></body></html>") ?> 持有您创建的匿名内部类的实例。因此,myButton可以在其上调用myButton

答案 2 :(得分:1)

在按钮对象中调用onclick事件,此对象将使用您设置的引用委托您的匿名类onclick。