2013-07-11 3 views
-2

Я использую два разных макета для одной и той же деятельности. При изменении ориентации состояние активности не поддерживается. Пожалуйста, предложите, как это сделать?Сохранение состояния активности при изменении ориентации с использованием разных макетов?

+0

«с использованием двух разных раскладок же деятельности». подход не является хорошим. переосмыслите свой дизайн. – Raghunandan

+0

@Supreet означает, что вы создали 2 макета и хотите установить его при изменении ориентации. – TheFlash

+1

Какое «государство» вы на самом деле имеете в виду? Вы можете поместить почти любые метаданные в пакет onSavedInstanceState. – Neoh

ответ

2

Вы можете легко сохранить свое «состояние активности», используя onSavedInstanceState. Например:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if(saveInstanceState != null) { 
     if(savedInstanceState.getBoolean("running") == true) { 
      // previously is running 

     } else { 
     // previously not running 

     } 
    } 
} 


@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    if(condition) { 
     outState.putBoolean("running", true); 
    } 
} 
0

Вы, кажется, делать какую-то работу в AsyncTask, а затем вы меняете ориентацию. Переместите задачу, которую вы делаете, с AsyncTask в IntentService. После выполнения задания отправьте трансляцию с результатом. В своей деятельности зарегистрируйте номер BroadcastReceiver в onCreate и деблокируйте его в onDestroy.

Этот приемник будет обрабатывать результат вашей работы. Вы также можете отправить от IntentService некоторые промежуточные данные/обновления выполнения, которые могут быть получены и обработаны одним и тем же получателем.

EDIT: Чтобы показать код.

first search result в Google для IntentService учебник. Но я настоятельно рекомендую прочитать больше о Services. Также у Vogella есть хорошая статья about this.

о BroadcastReceivers.

Если вы хотите что-то, чтобы вы начали здесь образец проект, который я построил в 15 минут:

activity:

package com.adip.droid.sampleandroid; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.content.LocalBroadcastManager; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.TextView; 

public class FrontActivity extends FragmentActivity { 

    private TextView labelData; 

    private BroadcastReceiver receiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if (WorkerService.WORK_PROGRESS_ACTION.equals(action)) { 
       publishProgress(intent.getStringExtra(WorkerService.WORK_KEY_PROGRESS)); 
      } else if (WorkerService.WORK_END_ACTION.equals(action)) { 
       workInProgress = false; 
       publishResult(intent.getStringExtra(WorkerService.WORK_KEY_RESULT)); 
      } 
     } 
    }; 

    protected void publishProgress(String data) { 
     showMessage(data); 
    } 

    protected void publishResult(String data) { 
     showMessage(data); 
    } 

    private void showMessage(String data) { 
     labelData.setText(data); 
    } 

    /** 
    * Maybe you need this in order to not start the service once you have an ongoing job ... 
    * */ 
    private boolean workInProgress; 

    @Override 
    protected void onCreate(Bundle instanceState) { 
     super.onCreate(instanceState); 
     setContentView(R.layout.front_layout); 
     if (instanceState != null) { 
      workInProgress = instanceState.getBoolean("WORK_IN_PROGRESS", false); 
     } 
     labelData = (TextView) findViewById(R.id.labelData); 
     findViewById(R.id.btnWorker).setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       doTheJob(); 
      } 
     }); 
     IntentFilter filter = new IntentFilter(WorkerService.WORK_END_ACTION); 
     filter.addAction(WorkerService.WORK_PROGRESS_ACTION); 
     LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter); 
    } 

    protected void doTheJob() { 
     if (workInProgress) { 
      return; 
     } 
     Intent serviceIntent = new Intent(this, WorkerService.class); 
     serviceIntent.setAction(WorkerService.WORK_START_ACTION); 
     startService(serviceIntent); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putBoolean("WORK_IN_PROGRESS", workInProgress); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver); 
    } 
} 

его расположение:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/btnWorker" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:text="Start the work" /> 

    <TextView 
     android:id="@+id/labelData" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/btnWorker" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="35dp" 
     android:freezesText="true" 
     android:text="No data yet" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

</RelativeLayout> 

и IntentService:

package com.adip.droid.sampleandroid; 

import android.app.IntentService; 
import android.content.Intent; 
import android.support.v4.content.LocalBroadcastManager; 

public class WorkerService extends IntentService { 

    public static final String WORK_START_ACTION = "WORK_START_ACTION"; 
    public static final String WORK_END_ACTION = "WORK_END_ACTION"; 
    public static final String WORK_KEY_RESULT = "WORK_KEY_RESULT"; 
    public static final String WORK_PROGRESS_ACTION = "WORK_PROGRESS_ACTION"; 
    public static final String WORK_KEY_PROGRESS = "WORK_KEY_PROGRESS"; 

    public WorkerService() { 
     super("WorkerService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     if (WORK_START_ACTION.equals(intent.getAction())) { 
      startProgress(); 
     } 
    } 

    private void startProgress() { 
     publishProgress("Starting the job"); 
     synchronized (this) { 
      try { 
       wait(2500); 
      } catch (InterruptedException ignored) { 
      } 
     } 
     publishProgress("Progress Point A"); 
     synchronized (this) { 
      try { 
       wait(2500); 
      } catch (InterruptedException ignored) { 
      } 
     } 
     publishJobDone(); 
    } 

    public void publishProgress(String data) { 
     Intent progressIntent = new Intent(WORK_PROGRESS_ACTION); 
     progressIntent.putExtra(WORK_KEY_PROGRESS, data); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(progressIntent); 
    } 

    public void publishJobDone() { 
     Intent progressIntent = new Intent(WORK_END_ACTION); 
     progressIntent.putExtra(WORK_KEY_RESULT, "Job done!"); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(progressIntent); 
    } 
} 

Также не забудьте обновить свой манифест:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.adip.droid.sampleandroid" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 

     <activity 
      android:name=".FrontActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

     <service 
      android:name=".WorkerService" 
      android:exported="false" > 
     </service> 
    </application> 

</manifest> 
+0

У вас есть образец кода для него, так как я новый bie в Android-технологии, и это мой первый проект. – Supreet

+0

. Мое редактирование для этого – gunar

+0

спасибо, чувак, я изучу все это – Supreet

Смежные вопросы