How to retain EditText data on orientation change?

后端 未结 12 1948
暗喜
暗喜 2020-12-05 13:34

I have a Login screen which consists of 2 EditTexts for Username and Password. My requirement is that on orientation change , input data(if any) in EditText should r

12条回答
  •  清歌不尽
    2020-12-05 13:59

    Remove android:configChanges attribute from the menifest file and let android handle the orientation change your data in edittext will automatically remain.

    Now The problem you mentioned is with the progress dialog force close this is because when the orientation is changed the thread running in backgroud is trying to update the older dialog component whihc was visible. You can handle it by closing the dialog on savedinstancestate method and recalling the proceess you want to perform onRestoreInstanceState method.

    Below is a sample hope it helps solving your problem:-

    public class MyActivity extends Activity {
        private static final String TAG = "com.example.handledataorientationchange.MainActivity";
        private static ProgressDialog progressDialog;
        private static Thread thread;
        private static boolean isTaskRunnig;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG, "onCreate");
            setContentView(R.layout.main);
            Button button = (Button) findViewById(R.id.button);
            button.setOnClickListener(new EditText.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    perform();
                    isTaskRunnig = true;
                }
            });
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        public void perform() {
            Log.d(TAG, "perform");
            progressDialog = android.app.ProgressDialog.show(this, null,
                    "Working, please wait...");
            progressDialog
                    .setOnDismissListener(new DialogInterface.OnDismissListener() {
    
                        @Override
                        public void onDismiss(DialogInterface dialog) {
                            //isTaskRunnig = false;
                        }
                    });
            thread = new Thread() {
                public void run() {
                    Log.d(TAG, "run");
                    int result = 0;
                    try {
    
                        // Thread.sleep(5000);
                        for (int i = 0; i < 20000000; i++) {
    
                        }
                        result = 1;
                        isTaskRunnig = false;
                    } catch (Exception e) {
                        e.printStackTrace();
                        result = 0;
                    }
                    Message msg = new Message();
                    msg.what = result;
                    handler.sendMessage(msg);
                };
            };
            thread.start();
        }
    
        // handler to update the progress dialgo while the background task is in
        // progress
        private static Handler handler = new Handler() {
    
            public void handleMessage(Message msg) {
                Log.d(TAG, "handleMessage");
                int result = msg.what;
                if (result == 1) {// if the task is completed successfully
                    Log.d(TAG, "Task complete");
                    try {
                        progressDialog.dismiss();
                    } catch (Exception e) {
                        e.printStackTrace();
                        isTaskRunnig = true;
                    }
    
                }
    
            }
        };
    
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
            Log.d(TAG, "onRestoreInstanceState" + isTaskRunnig);
            if (isTaskRunnig) {
                perform();
    
            }
        }
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            Log.d(TAG, "onSaveInstanceState");
            if (thread.isAlive()) {
                thread.interrupt();
                Log.d(TAG, thread.isAlive() + "");
                progressDialog.dismiss();
            }
    
        }
    

提交回复
热议问题