আগে থেকে থাকা অ্যাপে Kotlin যোগ করা

Android Studio Kotlin-এর জন্য সম্পূর্ণ সহায়তা প্রদান করে, যা আপনাকে নিজের বর্তমান প্রোজেক্টে Kotlin ফাইল যোগ করতে এবং Java ল্যাঙ্গুয়েজ কোডকে Kotlin-এ কনভার্ট করতে সাহায্য করে। তারপরে, আপনি Kotlin কোডের সাথে Android Studio-র আগে থেকেই থাকা সব টুল ব্যবহার করতে পারবেন, এর মধ্যে অটো-কমপ্লিট, লিন্ট চেকিং, রিফ্যাক্টরিং, ডিবাগিং এবং আরও অনেক কিছু অন্তর্ভুক্ত।

আপনি নতুন প্রোজেক্ট শুরু করতে চাইলে এবং Kotlin ব্যবহার করতে চাইলে, প্রোজেক্ট তৈরি করুন দেখুন।

স্যাম্পেলের জন্য, আমাদের Kotlin কোড স্যাম্পেল দেখুন।

আগে থেকে থাকা প্রোজেক্টে Kotlin যোগ করা

আপনার প্রোজেক্টে Kotlin যোগ করতে, নিম্নলিখিত কাজগুলি করুন:

  1. ফাইল > নতুন বিকল্পে ক্লিক করুন এবং বিভিন্ন Android টেমপ্লেটের মধ্যে থেকে একটি বেছে নিন, যেমন নতুন ফাঁকা Fragment, যা ১ নম্বর ছবিতে দেখানো হয়েছে। এই মেনুতে টেমপ্লেটের তালিকা দেখতে না পেলে, প্রথমে প্রোজেক্ট উইন্ডো খুলুন এবং আপনার অ্যাপ মডিউল বেছে নিন।

    নতুন খালি ফ্র্যাগমেন্ট তৈরি করা
    ছবি ১. উপলভ্য টেমপ্লেট থেকে বেছে নিন, যেমন fragment বা activity.
  2. যে উইজার্ড দেখা যাবে, তাতে সোর্স ল্যাঙ্গুয়েজের জন্য Kotlin বেছে নিন। আপনি যখন নতুন অ্যাক্টিভিটি তৈরি করতে চান, তখন ২ নম্বর ছবিতে নতুন Android অ্যাক্টিভিটি ডায়ালগ দেখানো হয়।

    এমন ডায়ালগ যা আপনাকে সোর্স ল্যাঙ্গুয়েজ হিসেবে Kotlin বেছে নিতে দেয়
    ছবি ২. নতুন Android অ্যাক্টিভিটি ডায়ালগ যেখানে আপনি সোর্স ভাষা হিসেবে Kotlin বেছে নিতে পারবেন।
  3. উইজার্ডের মাধ্যমে চালিয়ে যান।

অথবা, আপনি ফাইল > নতুন > Kotlin ফাইল/ক্লাস বিকল্পে ক্লিক করে একটি প্রাথমিক Kotlin ফাইল তৈরি করতে পারেন। এই বিকল্পটি দেখতে না পেলে, প্রোজেক্ট উইন্ডো খুলুন এবং java ডিরেক্টরি বেছে নিন। নতুন Kotlin ফাইল/ক্লাস উইন্ডো আপনাকে ফাইলের নাম নির্ধারণ করতে দেয় এবং ফাইলের ধরনের জন্য বিভিন্ন বিকল্প প্রদান করে: ফাইল, ক্লাস, ইন্টারফেস, এনাম ক্লাস বা অবজেক্ট। আপনার বেছে নেওয়া বিকল্প নতুন Kotlin ফাইলে আপনার জন্য তৈরি করা প্রাথমিক স্ক্যাফোল্ডিং নির্ধারণ করে। আপনি ক্লাস বেছে নিলে, Android Studio প্রদত্ত নাম ও ম্যাচিং ক্লাস সংজ্ঞা সহ একটি নতুন Kotlin সোর্স ফাইল তৈরি করে। আপনি ইন্টারফেস বেছে নিলে, ফাইলে একটি ইন্টারফেস ঘোষণা করা হয় এবং আরও অনেক কিছু।

আপনি যদি এই প্রথমবার আপনার প্রজেক্টে সরাসরি (Android টেমপ্লেট ব্যবহার না করে) কোনও নতুন Kotlin ক্লাস বা ফাইল যোগ করে থাকেন, তাহলে Android Studio একটি সতর্কতা দেখাবে যে প্রজেক্টে Kotlin কনফিগার করা নেই, যেমনটি ৩ নম্বর ছবিতে দেখানো হয়েছে। এডিটরের উপরে ডানদিকের কোণে অথবা নিচে ডানদিকের কোণে পপ-আপ করা ইভেন্ট লগ অ্যালার্টে কনফিগার করুন বিকল্পে ক্লিক করে Kotlin কনফিগার করুন।

সতর্কতা ডায়ালগ যা আপনার প্রোজেক্টের জন্য Kotlin কনফিগার করতে
      প্রম্পট করে
ছবি ৩. আপনার প্রোজেক্টের জন্য Kotlin কনফিগার করা না থাকলে, Android Studio একটি সতর্কতা ডায়ালগ দেখায়।

প্রম্পট করা হলে, Kotlin ফাইল আছে এমন সব মডিউলের জন্য Kotlin কনফিগার করার বিকল্প বেছে নিন, যেমনটি ৪ নম্বর ছবিতে দেখানো হয়েছে:

Kotlin কোড আছে এমন সব মডিউলের জন্য Kotlin কনফিগার করার বিকল্প বেছে নিন
ছবি ৪. যেসব মডিউলে Kotlin কোড আছে, সেগুলির জন্য Kotlin কনফিগার করার বিকল্প বেছে নিন।

ঠিক আছে বিকল্পে ক্লিক করার পরে, Android Studio আপনার প্রোজেক্টের ক্লাসপাথে Kotlin যোগ করে এবং Kotlin ফাইল থাকা প্রতিটি মডিউলে Kotlin Android প্লাগ-ইন প্রয়োগ করে। আপনার build.gradle ফাইলগুলি নিচের উদাহরণগুলির মতো দেখতে হবে:

গ্ৰুভি

// Project build.gradle file.
buildscript {
    ext.kotlin_version = '1.4.10'
    ...
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

Kotlin

// Project build.gradle.kts file.
buildscript {
    extra["kotlin_version"] = "1.4.10"
    ...
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
    }
}

গ্ৰুভি

// Inside each module using kotlin
plugins {
    ...
    id 'kotlin-android'
}

...

dependencies {
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

Kotlin

// Inside each module using kotlin
plugins {
    ...
    kotlin("android")
}

...

val kotlin_version: String by rootProject.extra

dependencies {
    implementation("androidx.core:core-ktx:1.3.2")
    implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version")
}

সোর্স সংস্থা

সাধারণত, নতুন Kotlin ফাইল src/main/java/-এ সেভ করা হয়, এর ফলে একই জায়গায় Kotlin ও Java ফাইল দেখা সহজ হয়। আপনি যদি Java ফাইল থেকে Kotlin ফাইল আলাদা রাখতে চান, তাহলে Kotlin ফাইলকে src/main/kotlin/-এর মধ্যে রাখতে পারেন। আপনি এটি করলে, আপনাকে নিচে দেখানো মতো আপনার sourceSets কনফিগারেশনে এই ডিরেক্টরিও যোগ করতে হবে:

গ্ৰুভি

android {
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
}

Kotlin

android {
    sourceSets {
        getByName("main") {
            java.srcDir("src/main/kotlin")
        }
    }
}

আগে থেকে থাকা Java কোডকে Kotlin কোডে কনভার্ট করা

Java কোডকে Kotlin-এ কনভার্ট করতে, Android Studio-তে Java ফাইল খুলুন এবং কোড > Java ফাইলকে Kotlin ফাইলে কনভার্ট করুন বিকল্প বেছে নিন। অথবা, একটি নতুন Kotlin ফাইল তৈরি করুন (ফাইল > নতুন > Kotlin ফাইল/ক্লাস) এবং তারপরে আপনার Java কোডটি সেই ফাইলে পেস্ট করুন। তারপরে, Android Studio একটি প্রম্পট দেখায় এবং আপনার কোডকে Kotlin-এ কনভার্ট করার বিকল্প দেয়, যা ৫ নম্বর ছবিতে দেখানো হয়েছে। কনভার্ট করতে হ্যাঁ বিকল্পে ক্লিক করুন। আপনি ঐচ্ছিকভাবে পরের বার এই ডায়লগ দেখাবেন না বক্সে টিকচিহ্ন দিতে পারেন, এর ফলে ভবিষ্যতে কনভার্সন অটোমেটিক হবে।

Kotlin কোড আছে এমন সব মডিউলের জন্য Kotlin কনফিগার করার বিকল্প বেছে নিন
ছবি ৫. Android Studio, Java কোডকে Kotlin-এ কনভার্ট করতে পারে।

কোড কনভার্সন ও নাল হওয়া

Android Studio-এর কনভার্সন প্রসেস, ফাংশনালিটি-ইকুইভ্যালেন্ট Kotlin কোড তৈরি করে যা কম্পাইল ও রান করে। তবে, কনভার্ট করা কোডে আপনাকে অতিরিক্ত অপ্টিমাইজেশন করতে হতে পারে। যেমন, আপনি হয়ত কনভার্ট করা কোড কীভাবে নাল হতে পারে এমন ধরনের ডেটা ম্যানেজ করে তা আরও উন্নত করতে চান।

Android-এ, View অবজেক্ট এবং অন্যান্য কম্পোনেন্ট যে ফ্র্যাগমেন্ট বা অ্যাক্টিভিটির সাথে অ্যাটাচ করা আছে সেটি উপযুক্ত লাইফসাইকেল স্টেটে না পৌঁছানো পর্যন্ত সেগুলির ইনিশিয়ালাইজেশন ডিলে করা হয়। যেমন, আপনার কোনও ফ্র্যাগমেন্টে একটি বোতামের রেফারেন্স থাকতে পারে, যেমনটি নিম্নলিখিত স্নিপেটে দেখানো হয়েছে:

public class JavaFragment extends Fragment {

    // Null until onCreateView.
    private Button button;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_content, container,false);

        // Get a reference to the button in the view, only after the root view is inflated.
        button = root.findViewById(R.id.button);

        return root;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // Not null at this point of time when onViewCreated runs
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ...
            }
        });
    }
}

বোতাম ভেরিয়েবলটি নাল হলেও, এই উদাহরণে ব্যবহার করার সময় সেটি কখনওই নাল হওয়া উচিত নয়। তবে, যেহেতু কনস্ট্রাকশনের সময় এর ভ্যালু অ্যাসাইন করা হয় না, তাই জেনারেট করা Kotlin কোড Button কে নাল হতে পারে এমন টাইপ হিসেবে গণ্য করে এবং ক্লিক লিসনার যোগ করার সময় বোতাম আনর‍্যাপ করতে নন-নাল অ্যাসার্শন অপারেটর ব্যবহার করে, যেমন নিচে দেখানো হয়েছে:

class JavaFragment : Fragment() {

    // Null until onCreateView.
    private var button: Button? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?): View? {
        ...
        // Get a reference to the button in the view, only after the root view is inflated.
        button = root.findViewById(R.id.button)
        ...
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // Not null at the point of time when onViewCreated fires 
        // but force unwrapped nonetheless
        button!!.setOnClickListener { }
    }
}

এই কনভার্সনটি এই ক্ষেত্রে lateinit ব্যবহার করার চেয়ে কম আদর্শ, কারণ এটি অ্যাক্সেস করা হলে প্রতিটি জায়গায় আপনাকে নন-নাল অ্যাসারশন বা সেফ-কল অপারেটর দিয়ে বোতাম রেফারেন্স আনর‍্যাপ করতে বাধ্য করা হয়।

অন্যান্য ক্ষেত্রে, যেখানে null হল আপনার অ্যাপ্লিকেশনের ব্যবহারের কেস অনুযায়ী একটি বৈধ ভেরিয়েবল অ্যাসাইনমেন্ট, সেখানে একটি সমাপ্তি এলভিস অপারেটর (?:) অপারেটরের সাথে একটি সেফ-কল (?.) অপারেটর ব্যবহার করা, নাল মান গ্রহণকারী অবজেক্টকে নিরাপদে আনর‍্যাপ করা বা একটি বোধগম্য নন-নাল ডিফল্ট ভ্যালুতে কোয়ের্স করার আরও উপযুক্ত উপায় হতে পারে। কনভার্সন প্রসেস চলাকালীন এই সিদ্ধান্ত নেওয়ার জন্য Android Studio-র কাছে পর্যাপ্ত তথ্য নেই। এটি ডিফল্ট হিসেবে নন-নাল অ্যাসারশন সেট করলেও, আপনাকে ফলো-আপ করতে হবে এবং প্রয়োজন অনুযায়ী কনভার্ট করা কোড অ্যাডজাস্ট করতে হবে।

আরও তথ্য

আপনার প্রজেক্টে Kotlin ও Java, দুটি কোডই ব্যবহার করা সম্পর্কে আরও জানতে, Kotlin থেকে Java কোড কল করা দেখুন।

এন্টারপ্রাইজ সিনারিওতে Kotlin ব্যবহার করা সম্পর্কে আরও জানতে, বৃহৎ টিমের জন্য Kotlin গ্রহণ করা দেখুন।

আগে থেকে থাকা Android API-এর জন্য ইডিওম্যাটিক Kotlin র‍্যাপার সম্পর্কে তথ্য পেতে, Android KTX দেখুন।