কীভাবে পুরো লেআউটটি রিফ্রেশ দেখুন?


173

Activity.onResume () পদ্ধতিটি বলে, আমি মূল লেআউট রিসোর্স ভিউটিকে পুনরায় আঁকা / রিফ্রেশ করতে বাধ্য করতে চাই। কিভাবে আমি এটি করতে পারব ?

প্রধান লেআউট ভিউয়ের দ্বারা, আমি আমার ক্রিয়াকলাপ.অনক্রিয়েট () তে যা বলা হয়েছে তার নীচে ('নীচে' R.layout.mainscreen ') বলতে চাই: -

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mainscreen);
}

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

ধন্যবাদও! যদিও আমি এখনও এ নিয়ে লড়াই করছি। আমি কি নীচে পোস্ট করেছি তা একবার দেখে নিতে পারেন। আমার থিমটি রিফ্রেশ করার জন্য আমার এই কোডটি (বা অন্য?) দরকার ...
মিকিআর

উত্তর:


149

প্রশ্নের কঠোর উত্তর দিতে: অবৈধ () ব্যবহার করুন:

সর্বজনীন শূন্যতা অবৈধ () যেহেতু: এপিআই স্তর 1

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

ViewGroup vg = findViewById (R.id.mainLayout);
vg.invalidate();

এখন, যখন ক্রিয়াকলাপটি পুনরায় শুরু হয়, তখন প্রতিটি ভিউ নিজেকে আঁকতে তোলে। () অবৈধ করতে কোনও কল প্রয়োজন হবে না। থিমটি প্রয়োগ করতে, নিশ্চিত হয়ে নিন যে কোনও ভিউ আঁকার আগে, আগে এটি করা হয়েছেsetContentView(R.layout.mainscreen);

সার্বজনীন শূন্যগতি সেট (থিম অবধি) যেহেতু: এপিআই স্তর 1

এই প্রসঙ্গে ভিত্তি থিম সেট করুন। দ্রষ্টব্য যে কনটেক্সটে কোনও মতামত ইনস্ট্যান্ট করার আগে এটি কল করা উচিত (উদাহরণস্বরূপ সেটকন্টেন্ট ভিউ (ভিউ) বা স্ফীতকরণের (ইনট, ভিউগ্রুপ))।

এপিআই ডক রেফারেন্সটি এখানে: http://developer.android.com/references/android/view/ContextThemeWrapper.html#setTheme%28int%29

যেহেতু অনড্রে () পদ্ধতিটি ইতিমধ্যে ইনস্ট্যান্টেড ভিউগুলিতে কাজ করে, সেট থেমটি কাজ করবে না। থিমগুলির সাথে আমার নিজের অভিজ্ঞতা নেই তবে আমি দুটি বিকল্প বিকল্প মনে করতে পারি:

  1. পরিবর্তে সেটকে থিমটি অনক্রিটে () পরিবর্তে, বা
  2. redo setContentView (R.layout.mainscreen); সমস্ত লেআউট পুনরায় জোর করতে।

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

@ মিকিআর না, এটি করা উচিত নয়। আমার আপডেট হওয়া উত্তরটি পরীক্ষা করুন। যদি এই দুটি বিকল্প কাজ না করে তবে আপনার ক্রিয়াকলাপটি পুনরায় চালু করতে হবে।
আলেয়াদাম

বিকল্প (1) কাজ করে। আমার অ্যাপ্লিকেশনটি সঠিক থিম দিয়ে শুরু হবে, তবে আমি যদি চলমান অবস্থায় এটি পরিবর্তন করি তবে আমাকে আমার অ্যাপ্লিকেশনটি আবার শুরু করতে হবে যাতে অনক্রিট () আবার কল করা হবে।
মিকিআর

বিকল্প (2) হ'ল আমি যে রুটটি নিতে চাইছিলাম। সুতরাং, যখন থিমটি চলমান চলাকালীন পরিবর্তন করা হবে, তখন আমি অনার্সার্ট () এটি করতে চেয়েছিলাম: - setTheme (getPreferencesTheme ()); এবং সেটকন্টেন্টভিউ (R.layout.main); তবে এটি আমার থিম পরিবর্তন করে না। আমি এই দ্বিতীয় বিকল্পটি কাজ করতে পারি না ...!?
মিকিআর

আমি বুঝতে পেরেছি যে বিকল্প (2) কাজ করার জন্য আমাকে 'ভিউয়ের স্তরক্রমটি পুনরায় স্ফীত করা উচিত'। এটি অর্জনের জন্য আমি বিভিন্ন জিনিস চেষ্টা করেছি, তবে এর অর্থ কী এবং এটি কীভাবে করা যায় তা আমি সত্যিই নিশ্চিত নই।
মিকিআর

41

চেষ্টা getWindow().getDecorView().findViewById(android.R.id.content).invalidate();


3
ধন্যবাদ! একই উত্তর আমি উপরে আলেয়াদাম পোস্ট। এটি অকার্যকর () ক্রিয়াকলাপের থিমকে রিফ্রেশ করার কারণ নয় যা আমার প্রয়োজন।
মিকিআর

36

চেষ্টা করুন এর recreate()ফলে এই ক্রিয়াকলাপটি পুনরায় তৈরি হবে।


4
আমি এই থ্রেডের সমস্ত অপশন চেষ্টা করেছি এবং এটিই কেবলমাত্র কমপক্ষে অনাকাঙ্ক্ষিত পার্শ্ব-প্রতিক্রিয়া নিয়ে কাজ করেছে।
সোবিবি

1
onResumeপদ্ধতিতে এটি করার জন্য যদি আমার এটির প্রয়োজন হয় । এটি আমাকে ইনফিন্ট লুপ দেয়: /
কামিল উইটকোভস্কি

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

এটি কার্যকর হয় তবে আমি এটি বাস্তব উত্পাদন মোড অ্যাপ্লিকেশনটিতে ব্যবহার করার পরামর্শ দেব না। আমার কেবল এটির ডিবাগ মোডের প্রয়োজন ছিল তাই পুরো ইউআই রিফ্রেশের পার্শ্ব প্রতিক্রিয়া গুরুতর নয়।
18'8

31

সমাধান:

ছেলেরা আমি আপনার সমাধানগুলি সব চেষ্টা করেছিলেন কিন্তু তারা আমার জন্য কাজ করা হয়নি, আমি সেট করতে setVisibility করার editText এর প্রোফাইল এবং এই editText তারপর দেখতে পাওয়া উচিত ScrollView , কিন্তু আমি মূল দৃশ্য রিফ্রেশ করতে কার্যকরী করতে অক্ষম ছিল। আমি আমার সমস্যার সমাধান করেছি, যখন আমার দৃষ্টিভঙ্গিটি রিফ্রেশ করা দরকার তাই আমি স্ক্রোলভিউ দৃশ্যমানতাটিকে GONE এ পরিবর্তন করেছি এবং তারপরে আবার এটি কার্যকর হওয়ার জন্য এটি ভিসিবিলে সেট করেছিলাম এবং এটি আমার পক্ষে কাজ করে। এটি সঠিক সমাধান নয় তবে এটি কেবল কাজ করেছে।

 private void refreshView(){
    mScrollView.setVisibility(View.GONE);
    mScrollView.setVisibility(View.VISIBLE);
}

2
@ মিকিআর দয়া করে একটি উত্তর গ্রহণ করুন, যাতে লোকেরা সহজেই সমাধানটি খুঁজে পেতে পারে
নাভিদ আহমদ

বাহ .. আমি সমস্ত প্রস্তাবিত সমাধানের চেষ্টাও করেছি তবে এটি কেবল একমাত্র কাজ করা মনে হচ্ছে তবে এটি
একধরণের

আমি জানিনা কেন @ মিকিরআর এই উত্তরটি মানছে না
নাভিদ আহমেদ

1
@ নাভিদআহমাদ আপনাকে ধন্যবাদ! আমি যা করতে পারলাম তার 4 ঘন্টা করার পরে, এটি কেবলমাত্র কাজটিই সমাধান করেছিল।
কোডেলিসিয়াস

10

কল করা invalidate()বা postInvalidate()মূল বিন্যাসে দৃশ্যত গ্যারান্টি দেয় না যে শিশুদের দর্শন পুনরায় চিত্রিত হবে। আমার নির্দিষ্ট ক্ষেত্রে, আমার মূল বিন্যাসটি একটি টেবিলআউট ছিল এবং টেবিলরো এবং টেক্সটভিউ ক্লাসের বেশ কয়েকটি শিশু ছিল। কল করা postInvalidate(), requestLayout()বা এমনকিforceLayout() রুট উপর TableLayout বস্তুর কোন TextViews লেআউট প্রজাতন্ত্র গুলো বিন্যস্ত করা হতে হয়নি।

সুতরাং, আমি যেটা শেষ করেছিলাম তা হ'ল টেক্সটভিউগুলির জন্য সন্ধানকারী লেআউটটি পুনরাবৃত্তভাবে পার্স করা হয়েছিল এবং তারপরে postInvalidate()সেই সমস্ত পাঠ্য ভিউ অবজেক্টকে কল করা হয়েছিল।

কোডটি গিটহাবে পাওয়া যাবে: https://github.com/jkincali/Android- লাইনারলয়েআউট- পার্সার


9

অন্যথায় আপনি এটি ব্যবহার করে দেখতে পারেন-

ViewGroup vg = (ViewGroup) findViewById (R.id.videoTitleTxtView);
 vg.removeAllViews();
 vg.refreshDrawableState();

4
এর জন্য ধন্যবাদ ! তবে, এটি আমার সমস্ত ভিউ (টেক্সটভিউ, বাটন ইত্যাদি) সরিয়ে ফেলেছে তবে সেগুলি পুনরায়
আঁকেনি

আপনার ডানদিকে আপনার দৃশ্যটি রিফ্রেশ করতে হবে, তারপরে আপনাকে আবার অঙ্কন ফাংশনটি কল করতে হবে। পূর্ববর্তী ভিউ পরিষ্কার করার পরে।
দত্ত কুণ্ডে

4

আপনার অনুলিপিতে কেবল আপনার সামগ্রী প্রদর্শন করুন set

রিসুমের অভ্যন্তরে সেটকন্টেন্টভিউ (আর। লেআউটআউট.ইউরভিউ)

উদাহরণ:

@Override
public void onResume(){
super.onResume();
setContentView(R.layout.activity_main); 
postIncomeTotals();
}

হাই আমি এটি চেষ্টা করেছিলাম এবং তালিকার ভিউটিতে একই ডেটা দু'বার টানা হয়, সুতরাং যদি আমার 4 টি সারি থাকে এবং রিফ্রেশ করে পঞ্চম সারি যুক্ত করার কথা ছিল, পরিবর্তে আমি 10, 15 পরে শেষ করব ... কী করব না?
আইওএসএন্ড্রয়েড উইন্ডোজমোবাইল অ্যাপসদেব

4

থিসিং সমস্যাটির জন্য এই কার্যকারিতাটি চেষ্টা করুন:

@Override
public void onBackPressed() {
    NavUtils.navigateUpTo(this, new Intent(this,
            MyNeedToBeRefreshed.class));
}

3
Intent intent = getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);

এটি আপনাকে থিম পরিবর্তনের সাথে পুনরায় লোড করতে দেয় এবং অ্যানিমেশনগুলি গোপন করে।


3

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


2

এটি একটি পরিচিত বাগ হিসাবে উপস্থিত হবে ।


আমি যখন আমার ক্রিয়াকলাপটি পুনরায় চালু করব (কল ফিনিস () এবং তারপরে স্টার্টঅ্যাক্টিভিটি ()) সেট করুন তখন এটি সন্ধান করে। আমি আমার ক্রিয়াকলাপটি পুনরায় চালু না করে থিমটি রিফ্রেশ করতে পারি না ...
মিকিআর

0

আমি জানি না এটি নিরাপদ কিনা না তবে এটি আমার পক্ষে কাজ করে। আমি ধরণ নিজেকে এই সমস্যা গাড়ীতে আঘাত এবং চেষ্টা invalidate()এবং requestLayout()কিন্তু কোন উপকার। সুতরাং আমি onCreate(null)আবার আমার সমস্ত আবার কল এবং এটি কাজ করে। এটি যদি অনিরাপদ থাকে তবে দয়া করে আমাকে জানান। আশা করছি এটা ওখানে কাওকে সাহায্য করবে.


আপনি সেভড ইনস্ট্যান্সস্টেটটি নালায় সেট করছেন যা অপ্রত্যাশিত আচরণের কারণ হতে পারে। আরো তথ্যের জন্য: stackoverflow.com/questions/15115975/...
PhilipB

0

এইভাবে আমি আমার লেআউটটি রিফ্রেশ করতাম

Intent intent = getIntent();
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(intent);

0

ভিউগ্রুপ সম্প্রসারিত একটি ভিউ সাফ করার জন্য, আপনাকে কেবল পদ্ধতিটি ব্যবহার করতে হবে removeAllViews()

ঠিক এর মতো (যদি আপনার কাছে একটি ভিউগ্রুপ বলা হয় myElement):

myElement.removeAllViews()



-8

উদ্দেশ্যটি ব্যবহার করে কেবল ক্রিয়াকলাপটিকে আবার কল করুন। মেইনএ্যাকটিভিটির লেআউটটি রিফ্রেশ করার জন্য এটি করুন:

startActivity(new Intent(MainActivity.this, MainActivity.class));

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