2017-10-27 9 views
6

में लिखा गतिविधि इस ट्यूटोरियल का पालन करें कोई भी है।बटन onclick विशेषता अगर Kotlin

लेकिन अगर मैंने MainActivity.kt बटन OnClick विशेषता को दिखाने के लिए कुछ भी नहीं है, तो केवल none

क्या यह एंड्रॉइड स्टूडियो 3 बग है या मुझे कोटलिन के लिए कुछ याद आया?

जावा MainActivity:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    /** Called when the user taps the Send button */ 
    public void sendMessage(View view) { 
     // Do something in response to button 
    } 

} 

Kotlin MainActivity:

class MainActivity : AppCompatActivity() { 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 
    } 

    /** Called when the user taps the Send button */ 
    fun sendMessage(view: View) { 
     // Do something in response to button 
    } 
} 

OnClick attribute

एक्सएमएल लेआउट (जावा और Kotlin परियोजना एक ही हैं)

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 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" 
    tools:context="ir.bigbang.vahid.myapplication.MainActivity"> 

    <Button 
     android:id="@+id/button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Button" 
     tools:layout_editor_absoluteX="148dp" 
     tools:layout_editor_absoluteY="81dp" /> 
</android.support.constraint.ConstraintLayout> 
+0

क्या आप अपनी लेआउट फ़ाइल एक्सएमएल में पोस्ट कर सकते हैं? लेकिन मैं आपको लेआउट फ़ाइल पर 'onClick' सेट करने की अनुशंसा नहीं करता क्योंकि आप एक व्यू फ़ाइल पर प्रोग्रामिंग तर्क डाल रहे हैं। कोटलिन-एंड्रॉइड-एक्सटेंशन के साथ, आप आईडी द्वारा दृश्य तक पहुंच सकते हैं, लेआउट में इसे सेट करने की कोई बात नहीं है। – Joshua

+0

@ जोशुआ, लेआउट जोड़ा गया। – Vahid

उत्तर

4

ऐसा लगता है कि डिजाइनर अभी तक Kotlin समर्थन नहीं करता।

एक्सएमएल (अनुशंसित नहीं)

अपने Button टैग में निम्न पंक्ति जोड़ें: यहाँ कुछ समाधान कर रहे हैं। यह वही है जो डिजाइनर करेगा।

android:onClick="sendMessage" 

ओल्ड फैशन

कुछ भी जोड़ने की जरूरत नहीं है।

val button = findViewById<Button>(R.id.Button) 
button.setOnClickListener { 

} 

kotlin-android-एक्सटेंशन (अनुशंसित)

जोड़े अपने build.gradle

// button is the Button id 
button.setOnClickListener { 

} 
+0

मैंने जोड़ा 'प्लगइन लागू करें: "कोटलिन-एंड्रॉइड-एक्सटेंशन"' मेरे build.gradle पर, बहुत नीचे। लेकिन आप "// बटन कहां बटन आईडी बटन.सेटऑनक्लिक लिस्टनर { }" भाग कहां जोड़ते हैं? यदि आप मुझसे पूछें तो प्रारंभ करने में मैन्युअल में कोई त्रुटि है। – Freek

+2

ठीक है, मैंने इसे एक्सएमएल (एंड्रॉइड: ऑनक्लिक = "sendMessage") के माध्यम से किया है, जो काम करता है। लेकिन इसकी सिफारिश क्यों नहीं की जाती है? – Freek

0

आप आसानी से एक्सएमएल के अंदर इसे परिभाषित कर सकते हैं। लेकिन विशेषता का उपयोग अभी भी थोड़ा महंगा है।

इसके बजाय आप Kotlin Android Extensions और सिंथेटिक गुण उपयोग करने पर विचार कर सकता है:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 
    button.setOnClickListener { 
     // Do something in response to button 
    } 
} 
+0

मुझे इस तरह पता है। मैं उत्सुक था कि क्यों कोटलिन में विशेषता ने गतिविधि विधियों तक पहुंच नहीं ली। – Vahid

+0

और यहां मैं सोच रहा था @ वाहिद, आप इसे कैसे नोटिस करते हैं। मुझे लगता है कि 'क्लासपाथ' सही ढंग से सेटअप नहीं है। अब आप मुझे उत्सुक भी मिला है। – tynn

+0

@ जोशुआ के रूप में कहते हैं कि यह एंड्रॉइड स्टूडियो डिजाइनर के सापेक्ष होना चाहिए। – Vahid

0

यहाँ के apply plugin: "kotlin-android-extensions" समाधान मैं MainActivity.kt फ़ाइल में के साथ आया है।

override fun onCreate(savedInstanceState: Bundle?) { 

    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 

    val button = findViewById<Button>(R.id.button) 
    button.setOnClickListener { 
     sendMessage() 
    } 
} 

/** Called when the user taps the Send button */ 
private fun sendMessage() { 
    val editText = findViewById<EditText>(R.id.editText) 
    val message = editText.text.toString() 
    val intent = Intent(this, DisplayMessageActivity::class.java).apply 
    { 
     putExtra(EXTRA_MESSAGE, message) 
    } 
    startActivity(intent) 
} 
1

आपका कोड यह पसंद आएगा:

button.setOnClickListener(){ 
      Toast.makeText([email protected], "Its toast!", Toast.LENGTH_SHORT).show(); 
     } 

यहाँ आयात होगा:

import kotlinx.android.synthetic.main. activity_main.* 

यहाँ "बटन" .xml फ़ाइल में है कि बटन की आईडी है। यहां आपके जावा वर्ग में बटन ऑब्जेक्ट बनाने की आवश्यकता नहीं है।

+1

यह एक अधिक प्राकृतिक कोटलिन तरीका है, साथ ही बटन ऑब्जेक्ट प्राप्त करने के लिए भी अच्छा नहीं है –

संबंधित मुद्दे