পিছনে বোতাম এবং পূর্ববর্তী ক্রিয়াকলাপ সতেজ করা


85

আমাদের যদি দুটি কার্যক্রম থাকে:

  1. ফাইলগুলির তালিকা এবং সর্বশেষ পরিবর্তিত সময়
  2. ফাইল সম্পাদনা ক্রিয়াকলাপ

একজন ব্যবহারকারী তালিকা থেকে একটি ফাইল নির্বাচন করে এবং ফাইল সম্পাদনা ক্রিয়াকলাপে নিয়ে যাওয়া হয়। সম্পাদনা শেষ হয়ে গেলে ব্যবহারকারী ফাইল তালিকায় ফিরে আসার জন্য পিছনের বোতামটি টিপুন।

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

পিছনের বোতামটি চাপ দেওয়ার পরে ফাইল তালিকাটি রিফ্রেশ করার উপযুক্ত পদ্ধতি কী?

এই উদাহরণটি ধরে নিয়েছে যে কোনও ডাটাবেস ব্যবহার হচ্ছে না, কেবল একটি অ্যারেএডাপ্টার।


4
onRestart () এর আরও ভাল কাজ করা উচিত। onResume () দু'বার কল করা হবে এবং অন ব্যাকটি কেবল তখনই কল করা হবে যখন আপনি পিছনের বোতামটি টিপুন।
সারা সাকামোতো

উত্তর:


108

একটি বিকল্প হ'ল আপনার প্রথম ক্রিয়াকলাপের পুনরায় ব্যবহার শুরু করা।

@Override
public void onResume()
    {  // After a pause OR at startup
    super.onResume();
    //Refresh your stuff here
     }

অথবা আপনি ফলাফলের জন্য ক্রিয়াকলাপ শুরু করতে পারেন:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

দ্বিতীয় কার্যকলাপে আপনি যদি ডেটা ফেরত পাঠাতে চান:

 Intent returnIntent = new Intent();
 returnIntent.putExtra("result",result);
 setResult(RESULT_OK,returnIntent);     
 finish();

আপনি যদি ডেটা ফেরত দিতে না চান:

Intent returnIntent = new Intent();
setResult(RESULT_CANCELED, returnIntent);        
finish();

এখন আপনার ফার্স্টঅ্যাক্টিভিটি ক্লাসে onActivityResult()পদ্ধতির জন্য নিম্নলিখিত কোডটি লিখুন

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

  if (requestCode == 1) {

     if(resultCode == RESULT_OK){      
         //Update List         
     }
     if (resultCode == RESULT_CANCELED) {    
         //Do nothing?
     }
  }
}//onActivityResult

আমি যদি বর্তমান কার্যকলাপটি শেষ করতে না চাই এবং পূর্ববর্তী ক্রিয়াকলাপটি আপডেট করা চাই
মানসুউ ....

@ ওয়াজা_ onResumeআমাকে ফোন করা হয়নি, কেন কোন ধারণা? ( আমি চেষ্টা onRestartএবং onPauseখুব, কিন্তু তাদের কেউ বলা হয় না )
মেহেদী Dehghani

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

40

আমি মনে করি অনারস্টার্ট () এর জন্য আরও ভাল কাজ করে।

@Override
public void onRestart() { 
    super.onRestart();
    //When BACK BUTTON is pressed, the activity on the stack is restarted
    //Do what you want on the refresh procedure here
}

OnRestart () এর ভিতরে ক্রিয়াকলাপটি পুনরায় চালু হওয়ার পরে (ইভেন্টটি 'বোতাম বোতাম টিপানো' থেকে আবার কল করা হয়) আপনি কী করতে চান তা আপনি কোড করতে পারেন।

উদাহরণস্বরূপ, আপনি যদি ওনক্রিট () তে যা করেন একই জিনিস করতে চান, তবে কোডটিকে অনারস্টার্ট () এ আটকান (উদাহরণস্বরূপ, আপডেট হওয়া মানগুলির সাথে ইউআই পুনর্গঠন)।


7
এই তুচ্ছ, কিন্তু আমি আছে এটা বলতে: স্পষ্টত এটি একটি পৃথক পদ্ধতি তারপর আপনি উভয় onCreate () এবং সেইসাথে onRestart () পরিবর্তে কপি থেকে এটা পেস্ট ডাকা যে আপনার onCreate () কোড সরাতে ভালো হতে চাই।
রিকার্ডো ভ্যান ডেন ব্রুক

আপনি কেবলমাত্র ভিউগুলিকে স্ফীত করতে এবং বৈশ্বিক ভেরিয়েবলগুলি ইনস্ট্যান্ট করতে ও অন স্টার্ট () সেট করতে / (পুনরায়) সেট করতে ব্যবহার করতে পারেন C সুতরাং আপনার উদ্যোগ () (বা আপনি যা কিছু বলতে চান) কল করা হবে যখনই ক্রিয়াকলাপ শুরু হয়; যেমন onCreate () এর পরে বা onRestart () এর পরে।
জোহোরেল

আপনার ক্রিয়াকলাপের ভিউমোডেলটিকে পুনরায় পুনঃনির্মাণের প্রয়োজন হলে এটি সত্যিই দরকারী। এটি আবার ডাটাবেস থেকে আনতে দেয়, সেটআপ ইনস্ট্যান্স ভেরিয়েবল ...
বিশাল

34

মূলত:

@Override
public void onRestart()
{
    super.onRestart();
    finish();
    startActivity(getIntent());
}

আমি অনুমান করছি এটি বর্তমান ক্রিয়াকলাপে যায় না পূর্ববর্তী ক্রিয়াকলাপে?
Si8

4
আমার একই সমস্যা ছিল, আমার ব্যতীত ক্রিয়াকলাপ না খণ্ডিত। সুতরাং, আমি এখানে পরামর্শ অনুসরণ করি এবং এটি কাজ করেছে: stackoverflow.com/questions/35039512/…
ডেভিড সি

8

আমি onResume()ক্রিয়াকলাপ নম্বর 1 এ পদ্ধতিটি ওভাররাইড করার পরামর্শ দিচ্ছি এবং এতে আপনার অ্যারে অ্যাডাপ্টারটি রিফ্রেশ করার কোড রয়েছে, এটি ব্যবহার করে এটি করা হয়[yourListViewAdapater].notifyDataSetChanged();

তালিকাটি রিফ্রেশ করতে আপনার যদি সমস্যা হয় তবে এটি পড়ুন: অ্যান্ড্রয়েড তালিকার ভিউ রিফ্রেশ


2

আপনি যদি পূর্ববর্তী ক্রিয়াকলাপটি রিফ্রেশ করতে চান তবে এই সমাধানটির কাজ করা উচিত:

পূর্ববর্তী ক্রিয়াকলাপে যেখানে আপনি রিফ্রেশ করতে চান:

@Override
public void onRestart()
{
    super.onRestart();
    // do some stuff here
}

1
private Cursor getAllFavorites() {
    return mDb.query(DocsDsctnContract.DocsDsctnEntry.Description_Table_Name,
            null,
            null,
            null,
            null,
            null,
            DocsDsctnContract.DocsDsctnEntry.COLUMN_Timest);
}
@Override
public void onResume()
{  // After a pause OR at startup
    super.onResume();
    mAdapter.swapCursor(getAllFavorites());
    mAdapter.notifyDataSetChanged();

}

public void swapCursor(Cursor newCursor){
    if (mCursor!=null) mCursor.close();
    mCursor = newCursor;
    if (newCursor != null){
        mAdapter.notifyDataSetChanged();
    }
}

আমার সবেমাত্র পছন্দের বিভাগ রয়েছে তাই যখন আমি পছন্দসই আইটেমটিতে ক্লিক করি তখন সেখানে এই জাতীয় তথ্য উপস্থিত হয় এবং যদি আমি এটি পছন্দ করি না - এই আইটেমটি ফেভারিট থেকে মুছে ফেলা উচিত: তার জন্য আমি ডাটাবেস রিফ্রেশ করে অ্যাডাপ্টারে সেট করি (পুনর্ব্যবহারের জন্য) [আমি আপনাকে ইচ্ছা করি আমার সমস্যা বুঝতে হবে & সমাধান]


কিছু ব্যাখ্যা যুক্ত করার কথা বিবেচনা করুন
গহন

1
 @Override
protected void onRestart() {
    super.onRestart();
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
}

পূর্ববর্তী ক্রিয়াকলাপে এই কোডটি ব্যবহার করুন। এটি একটি মসৃণ ট্রানজিশন করবে এবং যখন আপনি ফিরে বোতাম টিপে ফিরে আসবেন তখন ক্রিয়াকলাপটি পুনরায় লোড করবে।


আপনি কোডটিতে কিছু বিবরণ যুক্ত করতে পারেন এবং পোস্টটির জন্য আপনাকে ধন্যবাদ জানাতে পারেন।
নেলিস

0

যদি সম্পাদনা ক্রিয়াকলাপের সাথে কলব্যাক পরিচালনা না করে (তবেঅ্যাক্টিভিটিস রেজাল্ট সহ), তবে আমি বরং যুক্তস্টিকটি আপনি অনস্টার্টে (অথবা সম্ভবত অনরেস্টার্টে) রেখেছি, যেহেতু এটির রিসুমে থাকা কেবল ওভারকিলের মতো মনে হয়, প্রদত্ত পরিবর্তনগুলি কেবল পরে ঘটছে অনটপ।

যে কোনও হারে, ক্রিয়াকলাপের জীবনচক্রের সাথে পরিচিত হন । এছাড়াও, onRestoreInstanceState এবং onSaveInstanceState পদ্ধতিগুলি নোট করুন, যা সুন্দর জীবনচক্রের ডায়াগ্রামে প্রদর্শিত হয় না।

(এছাড়াও, নোটপ্যাড টিউটোরিয়ালটি আপনি কী করছেন তা কীভাবে পরিচালনা করে তা পর্যালোচনা করা উচিত , যদিও এটি ডেটাবেস ব্যবহার করে না))



0

এটা চেষ্টা কর

 public void refreshActivity() {
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

বা খণ্ডে

  public void refreshActivity() {
    Intent i = new Intent(getActivity(), MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
    finish();

}

এবং আপনার অনব্যাকপ্রেসড () এর মতো এই পদ্ধতিটি যুক্ত করুন

  @Override
public void onBackPressed() {      
        refreshActivity();
        super.onBackPressed();
    }
}

এটাই...


0
@Override
public void onBackPressed() {
    Intent intent = new Intent(this,DesiredActivity.class);
    startActivity(intent);
    super.onBackPressed();
}

এই প্রশ্নটি কয়েক বছরের পুরনো এবং সরবরাহিত উত্তরটি নিম্ন মানের পোস্ট হিসাবে পর্যালোচনার জন্য পতাকাঙ্কিত করা হয়েছিল। আমি কীভাবে একটি ভাল উত্তর লিখতে পারি তার জন্য এখানে কিছু গাইডলাইন রয়েছে ? । অন্যান্য উত্তরগুলি রয়েছে যা ওপির প্রশ্ন সরবরাহ করে এবং কিছু সময় আগে সেগুলি পোস্ট করা হয়েছিল। উত্তর পোস্ট করার সময়, দয়া করে নিশ্চিত হন যে আপনি কোনও নতুন সমাধান যুক্ত করেছেন, বা যথেষ্ট উত্তম ব্যাখ্যা, বিশেষত পুরানো প্রশ্নের উত্তর দেওয়ার সময়।
help-info.de
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.