অনক্রিয়াটভিউ এবং খণ্ডে অনভিউ তৈরির মধ্যে পার্থক্য


118

এই দুটি পদ্ধতির মধ্যে প্রয়োজনীয় পার্থক্য কী? আমি যখন একটি টেক্সটভিউ তৈরি করি তখন আমার কি অন্যের উপরের ব্যবহারের জন্য ব্যবহার করা উচিত?

সম্পাদনা: এর থেকে পার্থক্য কী

onCreateView() {
  root = some view
  View v = new View(some context);
  root.add(v);
  return root;
}


onViewCreated() {
  View v = new View(some context);
  getView().add(v);
}

আমি আমার বিভ্রান্তি বর্ণনা করতে একটি সম্পাদনা যুক্ত করেছি। একটি পদ্ধতি যদি অন্যের ঠিক পরে আসে তবে সেখানে দুটি আছে কেন? উপরের মতো সবকটি দৃশ্য নির্মাণ একক পদ্ধতিতে করা যায় না?
স্মিথ

7
আপনার যদি গুগল করতে হয় এবং অনুমান করতে হয় তবে সম্ভবত নামগুলি খারাপভাবে ব্যবহার করা হয়েছে।
বালজস নেমেথ

উত্তর:


85

আমরা ভিউ শুরু করার মধ্যে কিছু ক্র্যাশের মুখোমুখি onCreateView

আপনি আপনার লেআউট ফোলান উচিত onCreateViewকিন্তু ব্যবহার করে অন্যান্য মতামত আরম্ভ করা উচিত নয় findViewByIdমধ্যে onCreateView

কারণ মাঝে মাঝে ভিউ সঠিকভাবে শুরু হয় না। তাই সবসময় ব্যবহার findViewByIdমধ্যে onViewCreated(যখন দৃশ্য সম্পূর্ণরূপে নির্মিত হয়) এবং এটি প্যারামিটার হিসাবে দৃশ্য প্রেরণ করা হয়।

onViewCreated ভিউ সম্পূর্ণরূপে তৈরি হয়েছে তা নিশ্চিত করা।

onViewCreated অ্যান্ড্রয়েড ডকুমেন্টেশন

onCreateView( android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) ফিরে আসার পরপরই ডেকে আনা হয়েছে, তবে কোনও সংরক্ষিত রাজ্যের দৃশ্যে পুনঃস্থাপনের আগে। এটি সাবক্লাসগুলি তাদের দৃষ্টিভঙ্গি সম্পূর্ণরূপে তৈরি হয়ে যাওয়ার পরে তারা নিজেদের শুরু করার সুযোগ দেয়। খণ্ডটির দর্শন শ্রেণিবদ্ধকরণ যদিও এই মুহুর্তে তার পিতামাতার সাথে সংযুক্ত নেই।


4
ধন্যবাদ। আমিও এই সমস্যার মুখোমুখি হয়েছি এবং উপাদান ব্যবহার করেছি। post(...) পদ্ধতিটি প্রদর্শিত না হওয়া পর্যন্ত অপেক্ষা করা। সম্ভবত ফাইভ ভিউআইআইডি এবং অন্যান্য সূচনাটি এতে করে দেবে onViewCreated
কুলমাইন্ড

22
সেই লেখাটি কোথা থেকে উদ্ধৃত হয়েছিল? আমি অফিসিয়াল ডকুমেন্টেশনে এটি খুঁজে পাইনি।
ড্যানিয়েল

আপনি কি দয়া করে এখানে উদ্ধৃত বিবৃতিটির বিকাশকারী সাইট থেকে রেফারেন্স পোস্ট করতে পারেন?
নম্রতা বাগেরওয়াল

4
এটি আসলে সঠিক নয়। আপনি অনক্রিটভিউতে একটি ভিউ খুঁজে পেতে পারেন তবে কেবল আপনি এটি স্ফীত করার পরে এবং কেবলমাত্র আপনি ইতিমধ্যে স্ফীতকৃত ভিউ থেকে। ফ্রেগমেন্ট.ফাইন্ডভিউবিআইআইডি () নিরাপদ নয় তবে ভিউ.ফাইন্ডভিউবিআইআইডি () নিরাপদ যদি আপনি ইতিমধ্যে খণ্ডের দৃশ্যে স্ফীত করেন।
কোলিনথশটস

46

onViewCreatedএর সাথে সাথেই ডেকে আনা হয় onCreateView(আপনি যে পদ্ধতিটি আরম্ভ করেন এবং আপনার সমস্ত বস্তু তৈরি করেন TextViewএটি সহ ), সুতরাং এটি কার্য সম্পাদনের বিষয় নয়।

বিকাশকারী সাইট থেকে:

অনভিউ তৈরি করা হয়েছে (দেখুন দেখুন, বান্ডেল সেভড ইনস্ট্যান্সস্টেট)

অনক্রিয়েটভিউ (লেআউটআইনফ্লেটার, ভিউগ্রুপ, বান্ডিল) ফিরে আসার সাথে সাথে কল করা হয়েছে, তবে কোনও সংরক্ষিত অবস্থা ভিউতে পুনরুদ্ধার করার আগে। এটি সাবক্লাসগুলি তাদের দৃষ্টিভঙ্গি সম্পূর্ণরূপে তৈরি হয়ে যাওয়ার পরে তারা নিজেদের শুরু করার সুযোগ দেয়। খণ্ডটির দর্শন শ্রেণিবদ্ধকরণ যদিও এই মুহুর্তে তার পিতামাতার সাথে সংযুক্ত নেই।

উত্স: খণ্ড # অনভিউ তৈরি করা


28

ক্ষেত্রগুলিতে সাবভিউগুলির যে কোনও অ্যাসাইনমেন্ট করা ভাল onViewCreated। এর কারণ ফ্রেমওয়ার্কটি আপনার ফ্রেগমেন্টের ভিউ হায়ারার্কি সঠিকভাবে তৈরি করা এবং স্ফীত করা হয়েছে কিনা তা নিশ্চিত করার জন্য একটি স্বয়ংক্রিয় নাল চেক করে।

কোড স্নিপেট থেকে: ফ্র্যাগমেন্টম্যাঞ্জার.জভা

// This calls onCreateView()
f.mView = f.performCreateView(f.getLayoutInflater(f.mSavedFragmentState), null, f.mSavedFragmentState);

// Null check avoids possible NPEs in onViewCreated
// It's also safe to call getView() during or after onViewCreated()
if (f.mView != null) {
    f.mView.setSaveFromParentEnabled(false);
    if (f.mHidden) f.mView.setVisibility(View.GONE);
    f.onViewCreated(f.mView, f.mSavedFragmentState);
}

6
এটি ক্রমবর্ধমান মুদ্রাস্ফীতি / সৃষ্টির যুক্তি থেকে কোনও প্রাথমিককরণের যুক্তিকে পৃথক করে
কমলামেকো

1
এটি আকর্ষণীয়, কেন এই পদ্ধতির উন্নতি করার জন্য আপনার কাছে কোনও অতিরিক্ত সংস্থান আছে? এর অর্থ কি প্রতিটি অনক্রিয়েটভিউ পদ্ধতিতে কেবল "রিটার্ন ইনফ্লেটার.inflate (R.layout.layout_file, ধারক, মিথ্যা) থাকা উচিত;" এবং অনভিউ তৈরির সমস্ত "ফাইন্ডভিউবিআইআইডি" পদ্ধতি থাকা উচিত? এটি কোন পারফরম্যান্সের উত্সাহ তৈরি করে? এটি দ্রুত স্থানান্তর করতে চান?
android_student

আপনার প্রথম প্রশ্নের উত্তর onCreateViewদেওয়ার জন্য, টুকরাটির ভিউ হায়ারার্কি তৈরি করতে ব্যবহৃত হয়। এটি এক্সএমএল মুদ্রাস্ফীতি বা গতিশীল তৈরির মাধ্যমে (যেমন, জাভা প্রদর্শনগুলি ক্রমবর্ধমানভাবে তৈরি করা) এর মাধ্যমে হতে পারে। সুতরাং আপনি কিছু কল নাও করতে পারেন inflate। যদি এই খণ্ডটির কোনও UI উপাদান থাকা দরকার তবে আপনার কিছু পিতামাতৃ দৃষ্টিভঙ্গি ফিরে পাওয়া উচিত। অন্যথায় ফিরুন null
কমলামাখো

মোটেও পারফরম্যান্সের উত্সাহ নেই। এর জন্য FragmentManagerএবং টুকরা কোডটির দিকে তাকানperformCreateView , যা onCreateView github.com/android/platform_frameworks_base/blob/… কল করে , আপনাকে জীবনকালীনonViewCreated কলব্যাকের জন্য কয়েকটি জিনিসের গ্যারান্টি দেওয়া হয়েছে :
অরেঞ্জমেকো

১. ভগ্নাংশটি যদি পিতামাতার ক্রিয়ায় গতিশীলভাবে যুক্ত করা হয় তবে দৃশ্যের ধারকটি ধারকটির সাথে সংযুক্ত করা হবে। ২. আপনি এনপিই সম্পর্কে চিন্তা না করে সুরক্ষিতভাবে দেখতে দেখতে পারেন। ৩. আমি অ্যানিমেশনগুলির সাথে তেমন পরিচিত নই, তবে খণ্ডিত রূপান্তর ইতিমধ্যে শুরু হয়ে গিয়েছে (অর্থাত্, ইউআই থ্রেড বার্তা কাতারে প্রেরণ করা হয়েছে)।
কমলামাখো

13

onCreateViewস্ফীত দর্শনটি ফিরিয়ে দেয়। OnViewCreatedঠিক পরে বলা হয় onCreateViewএবং স্ফীত দর্শন প্যারামিটার পেতে। এর রিটার্ন টাইপ হয়void


1
আমি আমার বিভ্রান্তি বর্ণনা করতে একটি সম্পাদনা যুক্ত করেছি। একটি পদ্ধতি যদি অন্যের ঠিক পরে আসে তবে সেখানে দুটি আছে কেন? উপরের মতো সবকটি দৃশ্য নির্মাণ একক পদ্ধতিতে করা যায় না?
স্মিথ

3
onCreateView দ্রুত ফিরে আসা উচিত। অনভিউক্রিয়াট উদাহরণস্বরূপ স্টার্টমেন্ট সম্পাদন করতে ব্যবহার করা যেতে পারে। যেমনটি আমি বলেছি, অনভিউক্রিয়েটেডের প্যারামিটার হিসাবে সেই দৃশ্যটি আপনাকে অনক্রিটভিউয়ের ভিতরে ফুলে উঠেছে। সুতরাং আপনি getViewকলটি এড়াতে পারবেন
ব্ল্যাকবেল্ট

8

onCreateView()onCreate()ক্রিয়াকলাপগুলির জন্য খণ্ড সমতুল্য এবং দেখুন তৈরির সময় চালানো হয় । ভিউ তৈরি হওয়ার পরে
onViewCreated() চলে ।

should I use one over the other for performance? কোন । পারফরম্যান্স বৃদ্ধির কোনও প্রমাণ নেই।

onCreate()খণ্ডগুলিতে আসলে একটি পদ্ধতিও রয়েছে তবে এটি খুব কমই ব্যবহৃত হয় (আমি কখনই এটি ব্যবহার করি না , এটির জন্য কোনও ভাল ব্যবহারের ক্ষেত্রে খুঁজে পাই না )।

আমি সর্বদা onCreateView()টুকরাগুলিতে এর প্রতিস্থাপন হিসাবে ব্যবহার করি onCreate()
এবং আমি এতে খুশি।


2
@ স্পেস, কেন? আমি onCreateViewএটিকেও ক্রিয়াকলাপের সমতুল্য বলে মনে করি onCreate
কুলমাইন্ড

2
@ কুলমাইন্ড ওয়েল, এনপেস সম্পূর্ণ ভুল নয়, যেহেতু onCreate()ফ্রেমের ক্ষেত্রেও একটি পদ্ধতি রয়েছে। তবে এটি কখনও ব্যবহৃত হয় না (বা, কমপক্ষে, আমি কখনই এটি ব্যবহার করি না )। আমি সবসময় onCreateView()টুকরাগুলিকে প্রতিস্থাপন হিসাবে ব্যবহার করি ।
ফ্যান্ট্যামেক্সএক্স

1
@ রোটওয়াং, আপনার সাথে একমত! কিছু টিউটোরিয়ালস সেটহ্যাসঅপশনস মেনু (সত্য) স্থাপন করতে অনক্রিট ব্যবহার করে তবে আমি মনে করি এটি অনক্রিটভিউ বা অনভিউক্রিয়েটেডে আরও ভাল করবে।
কুলমাইন্ড

1
@ কুলমাইন্ড আমি সম্পূর্ণরূপে একমত। আমার উত্তরে আমি ভুল শব্দ ব্যবহার করেছি।
ফ্যান্ট্যামেক্সএক্স

1
@ রোটওয়াং, আপনি ঠিক বলেছেন। আমি যখন প্রথমবার টুকরো টুকরো ব্যবহার করেছি, তখন কেন জানি না অনক্রিট ব্যবহার করা হয় না।
কুলমাইন্ড

4

Fragment.onCreateView()আপাতত দস্তাবেজগুলি বলেছেন:

কেবলমাত্র এই পদ্ধতিতে লেআউট স্ফীত করা এবং যুক্তিটি অনভিউ তৈরির (ভিউ, বান্ডিল) ফিরে আসা ভিউতে পরিচালিত হওয়ার প্রস্তাব দেওয়া হয়।

আমাদের বোঝার দরকার নেই কেন; ডক্স যেমনটি বলেছে তেমনই আমাদের করা দরকার, তবে কেন এই প্রস্তাবটি বিদ্যমান তা জেনে রাখা আকর্ষণীয় হবে। আমার সেরা অনুমানটি উদ্বেগের বিচ্ছেদ , তবে আইএমএইচও এটি এটি হওয়ার চেয়ে কিছুটা জটিল করে তোলে।


যদি কারণটি উদ্বেগের বিচ্ছেদ হয় তবে ক্রিয়াকলাপটি কেন তার লেআউটে প্রবেশ setContentView()করে onCreate()?
মিনহাঘিয়া

@ মিনঘনঘিয়া ভালো পয়েন্ট। এই প্রশ্নের উত্তর কেবলমাত্র এটি হতে পারে যে এটি একটি ভিন্ন প্রোগ্রামার ভিন্নভাবে চিন্তাভাবনা করে ডিজাইন করেছিলেন (আমরা প্রথম অ্যান্ড্রয়েড পাওয়ার কয়েক বছর পরে খণ্ডগুলি প্রবর্তিত হয়েছিল), তবে কে জানে।
পেপ্পে এলজি

2

আমি যে প্রধান কারণটি ব্যবহার করব তা onViewCreatedহ'ল যেহেতু এটি কোনও প্রাথমিককরণের যুক্তিকে ভিউ হায়ারার্কি মুদ্রাস্ফীতি / সৃষ্টির যুক্তি থেকে পৃথক করে যা এর মধ্যে যেতে হবে onViewCreate। অন্যান্য সমস্ত পারফরম্যান্স বৈশিষ্ট্য একই দেখায়।


2

আমার মনে হয় এই মধ্যে মূল ভিন্ন যখন আপনি ব্যবহার kotlin.in onCreateView () প্রত্যেক সময় আপনি দেখতে অ্যাক্সেস আপনার XML ফাইল আপনি ব্যবহার করা উচিত করতে চান findViewByID কিন্তু onViewCreated আপনি যা করতে পারেন কেবল মাত্র তা আইডি কল করে আপনার ভিউ এক্সেস ।


এটা কি সত্যি? আমি কোডটি যদি কেবল কোনওভাবে আইডি ব্যবহার করি তবে আমি দেখার জন্য নালু হয়ে যাচ্ছি। আমার সর্বদা সন্ধানী ভিউবিআইডি ব্যবহার করা দরকার।
জিম লেস্ক

1
না এটি নয় .. অনক্রিয়েট ভিউ দর্শনকে তাত্পর্যপূর্ণ করে তোলে, ওনভিউ ক্রিয়েটকে অনক্রিয়েটভিউয়ের পরে বলা হয় এবং সংরক্ষণকৃত রাজ্যগুলি পুনরুদ্ধার করার আগে ... খণ্ডটির আজীবনক্রমে এটি আরও সময়সীমার বিষয়
me_

1

অনক্রিটভিউ লেআউট এবং স্ফীত ভিউ তৈরি করতে খণ্ডে ব্যবহৃত হয়। onViewCreated উপরের পদ্ধতি দ্বারা নির্মিত ভিউ রেফারেন্স ব্যবহার করা হয়। শেষ পর্যন্ত এটিঅ্যাক্টিভিটি ক্রিয়েটেডে অ্যাকশন শ্রোতাদের সংজ্ঞা দেওয়া ভাল অভ্যাস।

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