Kotlin Android नई गतिविधि शुरू करता है


103

मैं एंड्रॉइड पर एक और गतिविधि शुरू करना चाहता हूं लेकिन मुझे यह त्रुटि मिलती है:

कृपया रचनाकार मंगलाचरण निर्दिष्ट करें; क्लासिफायर 'पेज 2' में एक साथी ऑब्जेक्ट नहीं है

Intentकक्षा को तुरंत करने के बाद। त्रुटि को सुधारने के लिए मुझे क्या करना चाहिए? मेरा कोड:

class MainActivity : AppCompatActivity() {

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

    fun buTestUpdateText2 (view: View) {
        val changePage = Intent(this, Page2) 
        // Error: "Please specify constructor invocation; 
        // classifier 'Page2' does not have a companion object"

        startActivity(changePage)
    }

}

@BakaWaii वह पृष्ठ अब मौजूद नहीं है।
स्क्रे

जवाबों:


178

एक Activityजावा शुरू करने के लिए हमने लिखा Intent(this, Page2.class), मूल रूप से आपको Contextपहले पैरामीटर में और दूसरे पैरामीटर में गंतव्य वर्ग को परिभाषित करना होगा। Intentसोर्स कोड में विधि के अनुसार -

 public Intent(Context packageContext, Class<?> cls)

जैसा कि आप देख सकते हैं कि हमें Class<?>दूसरे पैरामीटर में टाइप करना होगा ।

यह लिखकर कि Intent(this, Page2)हम कभी निर्दिष्ट नहीं करते हैं कि हम कक्षा पास करने जा रहे हैं, हम classटाइप करने की कोशिश कर रहे हैं जो स्वीकार्य नहीं है।

उपयोग करें ::class.javaजो .classकोटलिन में वैकल्पिक है । अपने शुरू करने के लिए नीचे दिए गए कोड का उपयोग करेंActivity

Intent(this, Page2::class.java)

उदाहरण -

val intent = Intent(this, NextActivity::class.java)
// To pass any data to next activity
intent.putExtra("keyIdentifier", value)
// start your next activity
startActivity(intent)

4
किसी भी विचार के ::class.javaबजाय उन्होंने इसे क्यों बदल दिया .class? जावा की तुलना में कोटलिन दृष्टिकोण असामान्य रूप से जटिल है।
श्री-आईडीई

2
@ Mr-IDE classएक कोटलिन लौटाता है KClass, लेकिन एंड्रॉइड एक जावा की अपेक्षा करता है Class<...>, इसलिए .javaसंपत्ति।
kirbyfan64sos

34

सीधे शब्दों में आप एक शुरू कर सकते हैं Activityमें KOTLINइस सरल विधि का उपयोग कर,

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", value)
startActivity(intent)

1
नई गतिविधि शुरू करने के लिए आपको putExtra विधि का उपयोग करने की आवश्यकता नहीं है।
ShadeToD

@ShadeToD हाँ! putExtraविधि का उपयोग करने की आवश्यकता नहीं है । मैंने इसे नए शुरू करने के समय मानों के लिए जोड़ाActivity
गौतम सुब्रमण्यम

31

एक नई गतिविधि शुरू करने के लिए,

startActivity(Intent(this@CurrentClassName,RequiredClassName::class.java)

इसलिए अपना कोड बदलें:

class MainActivity : AppCompatActivity() {

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

    fun buTestUpdateText2 (view: View) {
        startActivity(Intent(this@MainActivity,ClassName::class.java))

        // Also like this 

        val intent = Intent(this@MainActivity,ClassName::class.java)
        startActivity(intent)
    }

2
यह @ एक्टिविटी जावा की एक्टिविटी के बराबर है।
इसिस

12

आप आम तौर पर BlahActivity::class.javaइनलाइन रिवाइज्ड जेनेरिक फ़ंक्शन को परिभाषित करके पैरामीटर के विनिर्देश को सरल बना सकते हैं ।

inline fun <reified T: Activity> Context.createIntent() =
    Intent(this, T::class.java)

क्योंकि वही आपको करने देता है

startActivity(createIntent<Page2>()) 

या और भी सरल

inline fun <reified T: Activity> Activity.startActivity() {
    startActivity(createIntent<T>()) 
} 

तो अब है

startActivity<Page2>() 

नौसिखिया को कोटलिन के रूप में, आप उस के साथ पुटक्स्ट्रा () के वेरिएबल नंबर (या कोई नहीं) को कैसे लगाएंगे?
Scre

1
आप inline fun <reified T: Activity> Context.createIntent(vararg extras: Pair<String, Any?>) = Intent(this, T::class.java).apply { putExtras(bundleOf(*extras)) }मेरे कहे अनुसार सेट कर सकते हैं और यह काम करेगा (यह मानकर कि आपके पास bundleOfandroid-ktx या ako है)
EpicPandaForce

10

आपको वर्ग प्रकार का दूसरा तर्क देना होगा। आप इसे नीचे की तरह थोड़ा और सुव्यवस्थित कर सकते हैं।

startActivity(Intent(this, Page2::class.java).apply {
    putExtra("extra_1", value1)
    putExtra("extra_2", value2)
    putExtra("extra_3", value3)
})


6

यह मेरी मुख्य गतिविधि है जहां मैं उपयोगकर्ता नाम और पासवर्ड को संपादित पाठ और सेटिंग से इरादे तक ले जाता हूं

class MainActivity : AppCompatActivity() {
val userName = null
val password = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
    val intent = Intent(this@MainActivity,SecondActivity::class.java);
    var userName = username.text.toString()
    var password = password_field.text.toString()
    intent.putExtra("Username", userName)
    intent.putExtra("Password", password)
    startActivity(intent);
 }
}

यह मेरी दूसरी गतिविधि है जहाँ मुझे मुख्य गतिविधि से मान प्राप्त करना है

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
var strUser: String = intent.getStringExtra("Username")
var strPassword: String = intent.getStringExtra("Password")
user_name.setText("Seelan")
passwor_print.setText("Seelan")
}

4

ऐसा इसलिए है क्योंकि आपकी Page2कक्षा में एक साथी वस्तु नहीं है जो staticआपकी कक्षा का उपयोग करने के लिए जावा में समान है । अपनी कक्षा को एक तर्क के रूप में पारित करने के लिए Intent, आपको ऐसा कुछ करना होगा

val changePage = Intent(this, Page2::class.java)

4

गतिविधि से गतिविधि तक

val intent = Intent(this, YourActivity::class.java)
startActivity(intent)

टुकड़े से गतिविधि तक

val intent = Intent(activity, YourActivity::class.java)
startActivity(intent)

4

खैर, मैंने इन 2 तरीकों को सभी परिणामों में से सबसे सरल पाया:

रास्ता # 1:

accoun_btn.setOnClickListener {
            startActivity(Intent(this@MainActivity, SecondActivity::class.java))
        }

रास्ता # 2: (सामान्य तरीके से)

    accoun_btn.setOnClickListener {
        startActivity<SecondActivity>(this)
    }

    private inline fun <reified T> startActivity(context: Context) {
            startActivity(Intent(context, T::class.java))
        }

नमूना



1

मेरे पास एक समान मुद्दा था, मैंने कोटलिन में अपना आवेदन लिखना शुरू कर दिया, अपनी एक गतिविधि को फिर से लिखने के बाद मैं देखना चाहता था कि क्या कोई समस्या है या नहीं, समस्या यह थी कि मुझे यकीन नहीं था कि java फ़ाइल से kotlin में आशय कैसे भेजें फ़ाइल।

इस मामले में मैंने कोटलिन (साथी वस्तु) में एक स्थिर कार्य बनाया, इस फ़ंक्शन को एक संदर्भ मिल रहा है (वर्तमान गतिविधि से) और कोटलिन वर्ग का उपयोग करते हुए वर्तमान संदर्भ ("जावा" संदर्भ) का उपयोग करते हुए नया इरादा लौटाता है (" :: class.java ")।

यहाँ मेरा कोड है:

 //this code will be in the kotlin activity - SearchActivity
 companion object {

    fun newIntent(context: Context): Intent {
        return Intent(context, SearchActivity::class.java)
    }
}

    //this is how you call SearchActivity from MainActivity.java
Intent searchIntent = SearchActivity.Companion.newIntent(this);
startActivity(searchIntent);

यदि आप @JvmStaticअपनी newIntentविधि में जोड़ते हैं तो आप इसे जावा से Companionभाग के बिना कह सकते हैं ।
8

0

विवरण

  • एंड्रॉइड स्टूडियो 3.1.4
  • कोटलिन संस्करण: 1.2.60

चरण 1. आवेदन ()

आप आवेदन के संदर्भ के लिए लिंक प्राप्त करें

class MY_APPLICATION_NAME: Application() {

    companion object {
        private lateinit var instance: MY_APPLICATION_NAME
        fun getAppContext(): Context = instance.applicationContext
    }

    override fun onCreate() {
        instance = this
        super.onCreate()
    }

}

चरण 2. राउटर ऑब्जेक्ट जोड़ें

object Router {
    inline fun <reified T: Activity> start() {
         val context =  MY_APPLICATION_NAME.getAppContext()
         val intent = Intent(context, T::class.java)
         context.startActivity(intent)
    }
}

प्रयोग

// You can start activity from any class: form Application, from any activity, from any fragment and other  
Router.start<ANY_ACTIVITY_CLASS>()

0

वह गतिविधि जोड़ना याद रखें जिसे आप प्रस्तुत करना चाहते हैं, अपने AndroidManifest.xmlभी :-) मेरे लिए यह समस्या थी।


0

कैसे इस बारे में encapsulation पर विचार करने के लिए?

उदाहरण के लिए:


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

        val title = intent.getStringExtra(EXTRA_TITLE) ?: EXTRA_TITLE_DEFAULT

        supportFragmentManager.beginTransaction()
            .add(R.id.frame_layout_fragment, ContentsFragment.newInstance())
            .commit()
    }

    // Omit...

    companion object {

        private const val EXTRA_TITLE = "extra_title"
        private const val EXTRA_TITLE_DEFAULT = "No title"

        fun newIntent(context: Context, title: String): Intent {
            val intent = Intent(context, ContentsActivity::class.java)
            intent.putExtra(EXTRA_TITLE, title)
            return intent
        }
    }

0

आप अपने आवेदन में कोटलिन और जावा दोनों फाइलों का उपयोग कर सकते हैं।

दो फ़ाइलों के बीच स्विच करने के लिए, सुनिश्चित करें कि आप उन्हें अद्वितीय <क्रिया Android: name = "" AndroidManifest.xml में दें, जैसे:

            <activity android:name=".MainActivityKotlin">
                <intent-filter>
                    <action android:name="com.genechuang.basicfirebaseproject.KotlinActivity"/>
                    <category android:name="android.intent.category.DEFAULT" />
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name="com.genechuang.basicfirebaseproject.MainActivityJava"
                android:label="MainActivityJava" >
                <intent-filter>
                    <action android:name="com.genechuang.basicfirebaseproject.JavaActivity" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>

फिर अपने MainActivity.kt में (कोटलिन फ़ाइल), जावा में लिखी एक गतिविधि शुरू करने के लिए, यह करें:

       val intent = Intent("com.genechuang.basicfirebaseproject.JavaActivity")
        startActivity(intent)

कोटलिन में लिखी एक गतिविधि शुरू करने के लिए अपने MainActivityJava.java (जावा फ़ाइल) में यह करें:

       Intent mIntent = new Intent("com.genechuang.basicfirebaseproject.KotlinActivity");
        startActivity(mIntent);

0

एक और गतिविधि के लिए नेविगेट करने का एक और सरल तरीका है

Intent(this, CodeActivity::class.java).apply {
                    startActivity(this)
                }

1
Pls अपने कोड को समझाने पर विचार करें और यह कैसे मदद करेगा, ताकि दूसरों को इससे लाभ मिल सके।
अमित वर्मा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.