নেভিগেশন মানচিত্র মিথস্ক্রিয়া সর্বোত্তম অনুশীলন

এই পৃষ্ঠায় আপনার অ্যাপে নেভিগেশন ম্যাপ ব্যবহার করার সর্বোত্তম পদ্ধতি ব্যাখ্যা করা হয়েছে।

যখনই সম্ভব, NavigationView এর পরিবর্তে NavigationFragment ব্যবহার করুন।

NavigationFragment NavigationView র‍্যাপ করে এবং এর লাইফসাইকেল কলব্যাকগুলো স্বয়ংক্রিয়ভাবে পরিচালনা করে, তাই আপনাকে নিজে থেকে সেগুলো পরিচালনা করার প্রয়োজন হয় না। এই পদ্ধতিতে ভুলের সম্ভাবনা কম এবং আপনার অ্যাপে নেভিগেশন ব্যবহারের জন্য এটিই প্রস্তাবিত উপায়। NavigationFragment ব্যবহার করার সময়, সরাসরি NavigationView লাইফসাইকেল ইভেন্টগুলো কল করবেন না।

NavigationView ব্যবহার করলে, লাইফসাইকেল মেথড কল করার সময় স্ট্রিক্ট অর্ডারিং ব্যবহার করুন।

NavigationView নেভিগেশন ম্যাপ ধারণ করে এবং অ্যান্ড্রয়েড অ্যাক্টিভিটি ও ফ্র্যাগমেন্টের মতো লাইফসাইকেল ইভেন্টগুলোকে নিবিড়ভাবে অনুসরণ করে, এবং এই লাইফসাইকেল ইভেন্টগুলো সংঘটিত হলে নির্দিষ্ট পদক্ষেপ গ্রহণ করে। NavigationView NavigationView#onCreate ও NavigationView#onStart একাধিক ইনিশিয়ালাইজেশন, NavigationView#onStop ও NavigationView#onDestroy ক্লিনআপ এবং অন্যান্য লাইফসাইকেল ইভেন্ট প্রক্রিয়াকরণের সময়ও এই কাজগুলো সম্পন্ন করে।

NavigationView লাইফসাইকেল মেথডগুলোর অর্থ Android অ্যাক্টিভিটি বা ফ্র্যাগমেন্টের মতোই। উদাহরণস্বরূপ, NavigationView এর onCreate মেথডটি Android অ্যাক্টিভিটি বা ফ্র্যাগমেন্টের লাইফসাইকেল কলব্যাকের মতোই কাজ করে এবং এটি সেই কলব্যাক দ্বারাই কল করা উচিত। যেহেতু NavigationView এর লাইফসাইকেল কলব্যাকগুলো Android-এর লাইফসাইকেল কলব্যাকের উপর ভিত্তি করে তৈরি এবং একই ক্রমে কল করা হয়, তাই এই NavigationView মেথডগুলোর একটি কঠোর ক্রম অনুসরণ করা আবশ্যক। অন্যথায়, আপনি মেমরি লিক , UI ত্রুটি, অবস্থান আপডেট না হওয়া এবং অন্যান্য সমস্যার সম্মুখীন হতে পারেন।

অ্যান্ড্রয়েড অ্যাক্টিভিটি লাইফসাইকেল সম্পর্কে আরও তথ্যের জন্য, অ্যান্ড্রয়েড ডেভেলপার ডকুমেন্টেশনের অ্যাক্টিভিটি-লাইফসাইকেল কনসেপ্টস বিভাগটি দেখুন।

নিম্নলিখিত সারণিতে দেখানো হয়েছে যে, নির্দিষ্ট লাইফসাইকেল মেথডগুলোর পরে অন্যান্য লাইফসাইকেল মেথডগুলো কখন আহ্বান করা উচিত:

জীবনচক্র পদ্ধতি অ্যাক্টিভিটি লাইফসাইকেলের কোন পর্যায়ে আহ্বান করা হয়েছে কোন লাইফসাইকেল পদ্ধতির পরে আহ্বান করা হয়েছে
onConfigurationChanged() যখন UI ফোরগ্রাউন্ডে থাকে এবং কনফিগারেশন পরিবর্তিত হয়, তখন এটি কার্যকর হয়। সর্বদা onStart() এর পরে
onTrimMemory() যখন কোনো অ্যাক্টিভিটি ব্যাকগ্রাউন্ডে থাকে তখন এটি চালু হয়। সর্বদা onPause() এর পরে
onSaveInstance() কোনো কার্যকলাপ ধ্বংস হওয়ার আগে এটি কার্যকর হয়। সর্বদা onStop() এর পরে

প্রথমে সংশ্লিষ্ট ক্লোজিং মেথডটি কল না করে এই লাইফসাইকেল মেথডগুলো একাধিকবার কল করবেন না। এছাড়াও, মনে রাখবেন যে, যদি এই অ্যান্ড্রয়েড লাইফসাইকেল কলব্যাকগুলোর কিছু অ্যাপ নিজেই পরিচালনা করে, এবং তৈরি বা চালু হওয়ার পরে ফ্র্যাগমেন্টে NavigationView যোগ করা হয়, তবে নেভিগেশন SDK সঠিকভাবে ইনিশিয়ালাইজ করার জন্য অ্যাপটিকে নির্দিষ্ট মেথডগুলো যথাযথ ক্রমে কল করতে হবে।

এই পদ্ধতিগুলো ব্যবহারের বিষয়ে অতিরিক্ত নির্দেশনার জন্য নেভিগেশন এসডিকে ডেমো অ্যাপটি দেখুন।

NavigationView ব্যবহার করলে, লাইফসাইকেল ইভেন্টগুলো অ্যাক্টিভিটি বা ফ্র্যাগমেন্ট থেকে কল করুন, উভয় জায়গা থেকে নয়।

লাইফসাইকেল মেথডগুলোর কঠোর ক্রম বজায় রাখতে, এই ইভেন্টগুলোকে অ্যাক্টিভিটি বা ফ্র্যাগমেন্ট লাইফসাইকেল কলব্যাক থেকে কল করুন, যেগুলো ইভেন্টগুলোকে ক্রমানুসারে গ্রহণ করে। এই পদ্ধতিটি নিশ্চিত করে যে অ্যাপগুলোকে ফ্র্যাগমেন্ট এবং অ্যাক্টিভিটির মধ্যে সমন্বয় করতে হবে না এবং এর ফলে ডুপ্লিকেট কলের সৃষ্টি হবে না।

SupportNavigationFragment থেকে NavigationFragment এ আপডেট করুন

Navigation SDK v8.0.0 থেকে, টার্ন-বাই-টার্ন নেভিগেশন এবং ম্যাপ প্রদর্শনের জন্য স্ট্যান্ডার্ড ফ্র্যাগমেন্ট কন্টেইনার হিসেবে অপ্রচলিত SupportNavigationFragment পরিবর্তে NavigationFragment ব্যবহৃত হচ্ছে।

NavigationFragment এবং SupportNavigationFragment মধ্যে সম্পূর্ণ API সমতা বজায় থাকে। আপনার অ্যাপ আপডেট করতে, XML লেআউট ফাইল এবং সোর্স কোড ইম্পোর্টে SupportNavigationFragment এর পরিবর্তে NavigationFragment ব্যবহার করুন। সমস্ত মেথড সিগনেচার এবং getSupportFragmentManager() কল একই থাকে।

লেআউট XML আপডেট করুন

আপনার লেআউট XML ফাইলগুলিতে SupportNavigationFragment NavigationFragment দিয়ে প্রতিস্থাপন করুন:

পূর্বে (v7.x এবং তার আগের সংস্করণ):

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/navigation_fragment"
    android:name="com.google.android.libraries.navigation.SupportNavigationFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

(v8.0.0+) এর পরে:

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/navigation_fragment"
    android:name="com.google.android.libraries.navigation.NavigationFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

আপনার অ্যাপ যদি FragmentContainerView ব্যবহার করে (ফ্র্যাগমেন্ট হোস্ট করার জন্য এটিই প্রস্তাবিত), তাহলে android:name অ্যাট্রিবিউটটি আপডেট করুন:

<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/navigation_fragment"
    android:name="com.google.android.libraries.navigation.NavigationFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

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

আপনার জাভা বা কোটলিন কোডে ইম্পোর্ট এবং ক্লাস কাস্ট প্রতিস্থাপন করুন। যেহেতু উভয় ক্লাসই androidx.fragment.app.Fragment এক্সটেন্ড করে, তাই ফ্র্যাগমেন্টটি খুঁজে বের করার জন্য getSupportFragmentManager() ব্যবহার করা চালিয়ে যান:

পূর্বে (v7.x এবং তার আগের সংস্করণ):

জাভা

import com.google.android.libraries.navigation.SupportNavigationFragment;

public class MainActivity extends AppCompatActivity {
  private SupportNavigationFragment mNavFragment;

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

    mNavFragment = (SupportNavigationFragment) getSupportFragmentManager()
        .findFragmentById(R.id.navigation_fragment);
  }
}
    

কোটলিন

import com.google.android.libraries.navigation.SupportNavigationFragment

class MainActivity : AppCompatActivity() {
  private lateinit var navFragment: SupportNavigationFragment

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

    navFragment = supportFragmentManager
        .findFragmentById(R.id.navigation_fragment) as SupportNavigationFragment
  }
}
    

(v8.0.0+) এর পরে:

জাভা

import com.google.android.libraries.navigation.NavigationFragment;

public class MainActivity extends AppCompatActivity {
  private NavigationFragment mNavFragment;

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

    mNavFragment = (NavigationFragment) getSupportFragmentManager()
        .findFragmentById(R.id.navigation_fragment);
  }
}
    

কোটলিন

import com.google.android.libraries.navigation.NavigationFragment

class MainActivity : AppCompatActivity() {
  private lateinit var navFragment: NavigationFragment

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

    navFragment = supportFragmentManager
        .findFragmentById(R.id.navigation_fragment) as NavigationFragment
  }
}
    

এপিআই সমতা

আপনাকে অন্য কোনো আচরণগত পরিবর্তন করতে বা আপনার কোড পুনর্গঠন করতে হবে না। NavigationFragment SupportNavigationFragment এর সমস্ত পাবলিক মেথড, লিসেনার ইন্টারফেস এবং কাস্টম UI কন্ট্রোলকে একই মেথড সিগনেচার সহ সমর্থন করে (যার মধ্যে getMapAsync() , getNavigator() , setEtaCardEnabled() , এবং setStylingOptions() অন্তর্ভুক্ত)।