কোটলিন অ্যান্ড্রয়েড নতুন ক্রিয়াকলাপ শুরু করে


105

আমি অ্যান্ড্রয়েডে অন্য কার্যকলাপ শুরু করতে চাই তবে আমি এই ত্রুটিটি পেয়েছি:

কনস্ট্রাক্টর অনুরোধ নির্দিষ্ট করুন; শ্রেণীবদ্ধকারী 'পৃষ্ঠা 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)
    }

}

@ বাকাকাওয়াই সেই পৃষ্ঠাটির আর অস্তিত্ব নেই।
স্কয়ার

উত্তর:


185

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? কোটলিন পদ্ধতির জাভা তুলনায় অস্বাভাবিক জটিল।
মিঃ-আইডিই

4
@ মিঃ-আইডিই classএকটি কোটলিন ফেরত দেয় KClassতবে অ্যান্ড্রয়েড জাভা প্রত্যাশা করে Class<...>, তাই .javaসম্পত্তিটি।
kirbyfan64sos

34

কেবলমাত্র আপনি একটি শুরু করতে পারেন Activityমধ্যে KOTLINএই সহজ পদ্ধতি ব্যবহার করে,

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

4
নতুন ক্রিয়াকলাপ শুরু করতে আপনার পুটেক্সট্রা পদ্ধতি ব্যবহার করার দরকার নেই।
শেডটিড

@ শ্যাডটিড হ্যাঁ! 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)
    }

4
এই @ ক্রিয়াকলাপ জাভার ক্রিয়াকলাপের সমান :) এই :)
লিওলস্টিন

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>() 

কোটলিনের নবাগত হিসাবে, আপনি কীভাবে পুটেক্সট্রা () এর একটি ভেরিয়েবল নম্বর (বা কোনও নয়) রোপণ করবেন?
স্কেয়ার

4
inline fun <reified T: Activity> Context.createIntent(vararg extras: Pair<String, Any?>) = Intent(this, T::class.java).apply { putExtras(bundleOf(*extras)) }আমি যা বলেছিলাম তার পরিবর্তে আপনি সেট আপ করতে পারেন এবং এটি কাজ করবে (ধরে bundleOfনিলে আপনার অ্যান্ড্রয়েড-কেটিএক্স বা অঙ্কো থেকে এসেছে)
এপিকপান্ডাফোরস

11

আপনাকে ক্লাস টাইপের দ্বিতীয় যুক্তি দিতে হবে। আপনি এটি নীচের মত কিছুটা আরও পরিপাটি করতে পারেন।

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

ক্রিয়াকলাপ থেকে ক্রিয়াকলাপ to

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

আমার একটি অনুরূপ সমস্যা ছিল, আমি কোটলিনে আমার আবেদনটি লিখতে শুরু করি, আমি আমার একটি ক্রিয়াকলাপ পুনরায় লেখার পরে আমি দেখতে চেয়েছিলাম যে কোনও সমস্যা আছে কিনা, সমস্যাটি ছিল যে আমি জাভা ফাইল থেকে কোটলিনে কোনও অভিপ্রায় কীভাবে প্রেরণ করব তা নিশ্চিত ছিলাম না ফাইল।

এই ক্ষেত্রে আমি কোটলিনে একটি স্থির ফাংশন তৈরি করেছি (সহচর অবজেক্ট), এই ফাংশনটি একটি প্রসঙ্গ (বর্তমান ক্রিয়াকলাপ থেকে) পাচ্ছে এবং কোটলিন শ্রেণি ব্যবহার করার সময় ("জাভা" প্রসঙ্গ) ব্যবহার করার সময় নতুন অভিপ্রায় ফিরে পাচ্ছে (" :: 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অংশটি ছাড়াই আপনি এটি জাভা থেকে কল করতে পারেন ।
ঘোরাঘুরি

0

বিশদ

  • অ্যান্ড্রয়েড স্টুডিও ৩.১.৪
  • কোটলিন সংস্করণ: 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

এটি কীভাবে এনক্যাপসুলেশন বিবেচনা করবেন?

উদাহরণ স্বরূপ:


    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

আপনি আপনার অ্যাপ্লিকেশনটিতে কোটলিন এবং জাভা উভয় ফাইলই ব্যবহার করতে পারেন।

দুটি ফাইলের মধ্যে স্যুইচ করতে, নিশ্চিত করুন যে আপনি এগুলি অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলকে অনন্য <অ্যাকশন অ্যান্ড্রয়েড: নাম = "দিয়েছেন:

            <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>

তারপরে আপনার মেইনএ্যাকটিভিটি.কটি (কোটলিন ফাইল) এ জাভাতে লেখা একটি ক্রিয়াকলাপ শুরু করতে এটি করুন:

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

আপনার মেইনএ্যাকটিভিটি জাভা.জভাতে (জাভা ফাইল), কোটলিনে লিখিত কোনও কার্যকলাপ শুরু করার জন্য, এটি করুন:

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

0

অন্য ক্রিয়াকলাপে নেভিগেট করার আরেকটি সহজ উপায়

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

4
আপনার কোডটি কীভাবে ব্যাখ্যা করা যায় এবং কীভাবে এটি সাহায্য করবে সে সম্পর্কে Pls বিবেচনা করে না, যাতে অন্যরা এতে উপকৃত হতে পারেন।
অমিত ভার্মা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.