android - কার্যকলাপ ঘূর্ণায়মান অ্যানড্রইড পুনরায় আরম্ভ করুন




rotation android-activity (20)

 onConfigurationChanged is called when the screen rotates. 
 (onCreate is no longer called when screen rotates due to manifest, see:  
 android:configChanges)

ম্যানিফেস্টের কোন অংশটি এটিকে বলে " onCreate() কল করবেন না"?

এছাড়াও, Google এর ডক্সগুলি android:configChanges ব্যবহার করা এড়াতে বলে android:configChanges (শেষ অবলম্বন ব্যতীত) ... তবে তারপরে বিকল্প পদ্ধতিগুলি তারা সুপারিশ করে যে সবগুলি android:configChanges ব্যবহার করুন android:configChanges

এটা আমার অভিজ্ঞতা হয়েছে যে এমুলেটর সর্বদা onCreate() উপর কল করে।
কিন্তু 1-2 টি যন্ত্র যা আমি একই কোড চালাই ... না। (কোন পার্থক্য হবে কেন নিশ্চিত না।)

আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনে, যখন আমি ডিভাইসটিকে ঘোরান (কীবোর্ডটি স্লাইড করে) তখন আমার Activity পুনরায় চালু হয় ( onCreate বলা হয়)। এখন, সম্ভবত এটি কীভাবে অনুমিত হওয়া উচিত, তবে onCreate পদ্ধতিতে আমি অনেকগুলি প্রাথমিক সেটিং আপ করি, তাই আমারও প্রয়োজন হয়:

  1. অন্য ফাংশনে সব প্রাথমিক সেটিংস রাখুন যাতে এটি ডিভাইসের ঘূর্ণন বা হারিয়ে যাওয়া সমস্ত না হয়
  2. এটিকে তৈরি করুন onCreate আবার বলা হয় না এবং লেআউটটি ঠিক বা সামঞ্জস্য করে
  3. অ্যাপ্লিকেশনটি কেবলমাত্র প্রতিকৃতিতে সীমাবদ্ধ করুন যাতে onCreate বলা হয় না।

অ্যানড্রইড ম্যানিফেস্টে করা পরিবর্তনগুলি হল:

android:configChanges="keyboardHidden|orientation" 

কার্যকলাপ ভিতরে তৈরি করা সংযোজন হয়:

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

আপনার ম্যানিফেস্টে এই লাইন যোগ করুন: -

android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode"

এবং কার্যকলাপ এই স্নিপেট: -

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

আপনি অ্যানড্রয়েড প্ল্যাটফর্মের স্থিতিবিন্যাস পরিবর্তনের onRetainNonConfigurationInstance() ডেটা ব্যবহার করেও বিবেচনা করতে পারেন: onRetainNonConfigurationInstance() এবং getLastNonConfigurationInstance()

এটি আপনাকে কনফিগারেশনের পরিবর্তে ডেটা স্থির রাখতে সহায়তা করে যেমন আপনি কোনও সার্ভার fetch থেকে অর্জিত তথ্য বা অন্য যেটি গণনা করা হয়েছে সেটি তৈরি করুন অথবা onCreate অ্যান্ড্রয়েডটিকে এখন আপনার অবস্থানের onCreate করার অনুমতি দেয়। ব্যাবহৃত হচ্ছে.

here বা এখানে দেখুন

এটি লক্ষ্য করা উচিত যে এই পদ্ধতিগুলি এখন অবমূল্যায়ন করা হয়েছে (যদিও উপরের setRetainInstance(true) সমাধানগুলি সর্বাধিক হিসাবে আপনার অভিযোজন পরিচালনা করার চেয়ে এখনও আরও বেশি নমনীয়) তবে Fragments স্যুইচ করার সুপারিশের সাথে সাথে প্রতিটি Fragment setRetainInstance(true) ব্যবহার করুন। ।


আপনি তার প্যারামিটারে সমস্ত মান সঞ্চয় করার জন্য অনSavedInstanceState পদ্ধতিটি ব্যবহার করতে হবে যা বান্ডিল আছে

@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        outPersistentState.putBoolean("key",value);
    }

আর ব্যবহার করুন

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        savedInstanceState.getBoolean("key");
    } 

পুনরাবৃত্তি এবং বস্তু দেখতে মান সেট এটি পর্দা ঘূর্ণন পরিচালনা করবে


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


আমি শুধু এই উপহাস আবিষ্কার:

অ্যাক্টিভেশন পরিবর্তনের মাধ্যমে জীবিত কার্যকলাপটি সংরক্ষণ করার জন্য এবং onConfigurationChanged মাধ্যমে এটি পরিচালনা করা, উপরে ডকুমেন্টেশন এবং কোড নমুনা ম্যানিফেস্ট ফাইলে এটি প্রস্তাব করে:

android:configChanges="keyboardHidden|orientation"

যা সবসময় এটি কাজ করে অতিরিক্ত সুবিধা আছে।

বোনাস OnCreate onConfigurationChanged OnCreate বাদ দেওয়া লজিক্যাল বলে মনে হতে পারে তবে এটি এমুলেটর (অন্তত Android 2.1 এর জন্য) এ ব্যর্থতা সৃষ্টি করে: শুধুমাত্র orientation নির্দিষ্ট করে OnCreate উভয়কে OnCreate এবং onConfigurationChanged OnCreate উভয়কেই কল করে এবং শুধুমাত্র অন্য সময় OnCreate

আমি একটি ডিভাইসে ব্যর্থতা দেখা যায় না, কিন্তু আমি এমুলেটর অন্যদের জন্য ব্যর্থ সম্পর্কে শুনেছেন। সুতরাং এটা নথি মূল্য।



এটি খুব সহজ মাত্র নীচের ধাপগুলি অনুসরণ করুন:

<activity
    android:name=".Test"
    android:configChanges="orientation|screenSize"
    android:screenOrientation="landscape" >
</activity>

এটি আমার জন্য কাজ করে:

নোট: অভিযোজন আপনার অনুরোধ উপর নির্ভর করে


ট্রায়াল এবং ত্রুটি কিছুক্ষণ পরে, আমি একটি সমাধান খুঁজে পাওয়া যায় যা বেশিরভাগ ক্ষেত্রে আমার প্রয়োজন মেটায়। এখানে কোডটি রয়েছে:

ম্যানিফেস্ট কনফিগারেশন:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.pepperonas.myapplication">

    <application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

প্রধান কাজ:

import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";

    private Fragment mFragment;

    private int mSelected = -1;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate  " + "");

        // null check not realy needed - but just in case...
        if (savedInstanceState == null) {

            initUi();

            // get an instance of FragmentTransaction from your Activity
            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

            /*IMPORTANT: Do the INITIAL(!) transaction only once!
            * If we call this everytime the layout changes orientation,
            * we will end with a messy, half-working UI.
            * */
            mFragment = FragmentOne.newInstance(mSelected = 0);
            fragmentTransaction.add(R.id.frame, mFragment);
            fragmentTransaction.commit();
        }
    }


    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged  " +
                   (newConfig.orientation
                    == Configuration.ORIENTATION_LANDSCAPE
                    ? "landscape" : "portrait"));

        initUi();

        Log.i(TAG, "onConfigurationChanged - last selected: " + mSelected);
        makeFragmentTransaction(mSelected);
    }


    /**
     * Called from {@link #onCreate} and {@link #onConfigurationChanged}
     */
    private void initUi() {
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate  instanceState == null / reinitializing..." + "");
        Button btnFragmentOne = (Button) findViewById(R.id.btn_fragment_one);
        Button btnFragmentTwo = (Button) findViewById(R.id.btn_fragment_two);
        btnFragmentOne.setOnClickListener(this);
        btnFragmentTwo.setOnClickListener(this);
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME!!!");
    }


    /**
     * Not invoked (just for testing)...
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onSaveInstanceState  " + "YOU WON'T SEE ME, AS WELL!!!");
    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume  " + "");
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause  " + "");
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy  " + "");
    }


    @Override
    public void onClick(View v) {

        switch (v.getId()) {
            case R.id.btn_fragment_one:
                Log.d(TAG, "onClick btn_fragment_one " + "");
                makeFragmentTransaction(0);
                break;

            case R.id.btn_fragment_two:
                Log.d(TAG, "onClick btn_fragment_two " + "");
                makeFragmentTransaction(1);
                break;

            default:
                Log.d(TAG, "onClick  null - wtf?!" + "");
        }
    }


    /**
     * We replace the current Fragment with the selected one.
     * Note: It's called from {@link #onConfigurationChanged} as well.
     */
    private void makeFragmentTransaction(int selection) {

        switch (selection) {
            case 0:
                mFragment = FragmentOne.newInstance(mSelected = 0);
                break;
            case 1:
                mFragment = FragmentTwo.newInstance(mSelected = 1);
                break;
        }

        // Create new transaction
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

        // Replace whatever is in the fragment_container view with this fragment,
        // and add the transaction to the back stack
        transaction.replace(R.id.frame, mFragment);

        /*This would add the Fragment to the backstack...
        * But right now we comment it out.*/
        //        transaction.addToBackStack(null);

        // Commit the transaction
        transaction.commit();
    }

}

এবং নমুনা ফ্র্যাগমেন্ট:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * @author Martin Pfeffer (pepperonas)
 */
public class FragmentOne extends Fragment {

    private static final String TAG = "FragmentOne";


    public static Fragment newInstance(int i) {
        Fragment fragment = new FragmentOne();
        Bundle args = new Bundle();
        args.putInt("the_id", i);
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView  " + "");
        return inflater.inflate(R.layout.fragment_one, container, false);
    }

}

github পাওয়া যাবে ।


প্রতিটি সময় যখন পর্দাটি ঘোরানো হয়, তখন খোলা ক্রিয়াকলাপটি শেষ হয় এবং ক্রিয়েট () আবার বলা হয়।

1। স্ক্রীনটি ঘোরানো অবস্থায় আপনি কার্যকলাপের অবস্থাটি সংরক্ষণ করতে পারেন এমন একটি জিনিস যাতে আপনি সমস্ত পুরানো স্টাফ পুনরুদ্ধার করতে পারেন যখন ক্রিয়াকলাপটি ক্রিয়েটিভ () আবার বলা হয়। this লিঙ্কটি পড়ুন

২। আপনি যদি কার্যকলাপটির পুনঃসূচনা রোধ করতে চান তবে আপনার manifest.xml ফাইলটিতে কেবল লাইন অনুসরণ করুন।

  <activity android:name=".Youractivity"
  android:configChanges="orientation|screenSize"/>

যখন আপনি অ্যান্ড্রয়েডের orientation পরিবর্তন করেন তখন onCreate পদ্ধতিটি এখনও বলা হয়। তাই এই পদ্ধতিতে সব ভারী কার্যকারিতা চলন্ত আপনাকে সাহায্য করতে যাচ্ছে না


Manifest.xml আপনার <activity> ট্যাগের ভিতরে নীচের কোডটি রাখুন:

android:configChanges="screenLayout|screenSize|orientation"

manifest ক্রিয়াকলাপ বিভাগে যোগ করুন:

android:configChanges="keyboardHidden|orientation"

অ্যাপ্লিকেশন ক্লাস ব্যবহার করে

আপনার প্রারম্ভিকতায় আপনি যা করছেন তার উপর নির্ভর করে আপনি একটি নতুন বর্গ তৈরি করতে বিবেচনা করতে পারেন যা Application প্রসারিত করে এবং আপনার প্রাথমিককরণ কোডটি সেই শ্রেণির মধ্যে একটি ওভাররাইড onCreate পদ্ধতিতে সরানো হয়।

public class MyApplicationClass extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    // TODO Put your application initialization code here.
  }
}

অ্যাপ্লিকেশন ক্লাসে onCreate শুধুমাত্র সমগ্র অ্যাপ্লিকেশনটি তৈরি হওয়ার onCreate বলা হয়, তাই কার্যকলাপটি অভিযোজন বা কীবোর্ড দৃশ্যমানতা পরিবর্তনগুলি পুনরায় আরম্ভ করে তা ট্রিগার করবে না।

একক্টন হিসাবে এই ক্লাসের উদাহরণটি প্রকাশ করা এবং অ্যাপ্লিকেশন ভেরিয়েবলগুলি প্রকাশ করা, যা আপনি Getters এবং Setters ব্যবহার করে শুরু করছেন।

দ্রষ্টব্য: নিবন্ধিত এবং ব্যবহৃত হওয়ার জন্য আপনাকে ম্যানিফেস্টে আপনার নতুন অ্যাপ্লিকেশন ক্লাসটির নাম উল্লেখ করতে হবে:

<application
    android:name="com.you.yourapp.MyApplicationClass"

কনফিগারেশন পরিবর্তনগুলিতে প্রতিক্রিয়া জানানো হচ্ছে [আপডেট: এপিআই 13 থেকে অব্যাহতিপ্রাপ্ত; প্রস্তাবিত বিকল্প দেখুন ]

আরো বিকল্প হিসাবে, আপনি আপনার অ্যাপ্লিকেশনটি এমন ইভেন্টগুলির জন্য শুনতে পারেন যা পুনরায় শুরু করতে পারে - যেমন অভিযোজন এবং কীবোর্ড দৃশ্যমানতা পরিবর্তন - এবং আপনার ক্রিয়াকলাপের মধ্যে তাদের পরিচালনা করে।

android:configChanges যুক্ত করে শুরু করুন android:configChanges আপনার ক্রিয়াকলাপের ম্যানিফেস্ট নোডে android:configChanges নোড পরিবর্তন করুন

android:configChanges="keyboardHidden|orientation"

অথবা Android 3.2 (API লেভেল 13) এবং নতুন জন্য :

android:configChanges="keyboardHidden|orientation|screenSize"

তারপর কার্যকলাপের মধ্যে নতুন onConfigurationChanged মধ্যে GUI লেআউটটি পুনঃ-সম্পন্ন করার জন্য জোর করে onConfigurationChanged পদ্ধতি এবং কল সেট onConfigurationChanged ওভাররাইড করুন।

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  setContentView(R.layout.myLayout);
}

দ্রষ্টব্য: ভবিষ্যতে যে কেউ আমার মতো একই সমস্যার মুখোমুখি হলে আমি এই উত্তরটি পোস্ট করি। আমার জন্য নিম্নলিখিত লাইন enought ছিল না:

android:configChanges="orientation"

যখন আমি পর্দাটি ঘোরান, তখন 'কনফিগারেশন চেঞ্জেড' (কনফিগারেশন নতুন কনফিগার) পদ্ধতিটি কল করা হয় নি।

সমাধান: সমস্যাটি স্থিতিবিন্যাসের সাথে থাকলেও আমাকে "স্ক্রীন সাইজ" যোগ করতে হয়েছিল। তাই AndroidManifest.xml - ফাইলে, এটি যুক্ত করুন:

android:configChanges="keyboardHidden|orientation|screenSize"

তারপর onConfigurationChanged(Configuration newConfig) পদ্ধতিটি onConfigurationChanged(Configuration newConfig)


আপনি আপনার কার্যকলাপে ViewModel বস্তু ব্যবহার করতে পারেন।

কনফিগারেশন পরিবর্তনের সময় ViewModel অবজেক্টগুলি স্বয়ংক্রিয়ভাবে বজায় রাখা হয় যাতে তারা যে তথ্য ধারণ করে তা পরবর্তী কার্যকলাপ বা ফ্যাগমেন্ট ইনস্ট্যান্সে অবিলম্বে উপলব্ধ হয়। আরও পড়ুন:

https://developer.android.com/topic/libraries/architecture/viewmodel


আপনি এই কোড ব্যবহার করে পর্দার বর্তমান অভিযোজন লক করতে পারেন ...

int currentOrientation =context.getResources().getConfiguration().orientation;
        if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) {
            ((Activity) context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else {
            ((Activity) context). setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }

মানুষ আপনি ব্যবহার করা উচিত বলছে

android:configChanges="keyboardHidden|orientation"

কিন্তু Android এ ঘূর্ণন পরিচালনা করার সেরা এবং সবচেয়ে পেশাদার উপায় লোডার ক্লাসটি ব্যবহার করা। এটি একটি বিখ্যাত শ্রেণী নয় (আমি কেন জানি না), তবে এটি AsyncTask এর চেয়ে ভাল উপায়। আরো তথ্যের জন্য, আপনি উদাসিটির Android কোর্সে পাওয়া Android টিউটোরিয়ালগুলি পড়তে পারেন।

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


orientationবিভিন্ন অভিযোজন বিভিন্ন কর্ম সঞ্চালন শ্রোতা ব্যবহার করুন ।

@Override
public void onConfigurationChanged(Configuration myConfig) 
{
    super.onConfigurationChanged(myConfig);
    int orient = getResources().getConfiguration().orientation; 
    switch(orient) 
    {
       case Configuration.ORIENTATION_LANDSCAPE:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                    break;
       case Configuration.ORIENTATION_PORTRAIT:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                    break;
       default:
          setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
}




android-activity