Решение проблем с перезапуском активности Android (из-за изменения ориентации экрана), предоставленное в stackoverflow, не работает для меня - PullRequest
1 голос
/ 22 ноября 2011

Я делаю демонстрационное приложение, чтобы проиллюстрировать, как я справляюсь с ориентацией экрана. Это простое приложение счетчика, которое увеличивает счетчик, когда пользователь нажимает кнопку увеличения и наоборот. Вот мой код, я включил android: configChanges = "клавиатура скрытая | ориентация" в файле манифеста, а также переопределил метод onConfigurationChanged. Но, к сожалению, я не могу сохранить значение счетчика, и когда я переключаю эмулятор в альбомную ориентацию, счетчик сбрасывается в 0, как мне решить эту проблему?

public class Counter_demoActivity extends Activity {

int count=0;
TextView tv;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //UIActivity();
    Button add1=(Button)findViewById(R.id.btn1);
    Button sub1=(Button)findViewById(R.id.btn2);
    tv=(TextView)findViewById(R.id.tv1);
    add1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        count++;
        tv.setText("Your Count is " + count);
    }
});
   sub1.setOnClickListener(new View.OnClickListener() {

    public void onClick(View v) {
        count--;
        tv.setText("Your Count is " +count);
    }
});
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);
    //UIActivity();
}
/*public void UIActivity(){
    this.tv=(TextView)this.findViewById(R.id.tv1);
    this.count=getChangingConfigurations();
}*/

}

Мой файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.arif.counter_demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" />
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" 
    >
    <activity
        android:label="@string/app_name"
        android:name=".Counter_demoActivity"
        android:configChanges="keyboardHidden|orientation|keyboard" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

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

</manifest>

Ответы [ 6 ]

3 голосов
/ 22 ноября 2011

Почему вы переопределяете onConfigurationChanged, когда вам не нужно это делать ... в вашем случае. Не удаляйте android: configChanges = "keyboardHidden | direction" в файле манифеста просто удалите код

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
setContentView(R.layout.main);
//UIActivity();
}

из вашего проекта. Очистите его и восстановите ...

1 голос
/ 22 ноября 2011

Вот трюк, который я нашел в блоге, когда у меня была такая же проблема. Попробуйте

Создать метод getsavedstuff ()

private void getsavedstuff() {
    Object mObject  = getLastNonConfigurationInstance();
}

и используйте его сразу после setContentView

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        getsavedstuff();
}
1 голос
/ 22 ноября 2011

Ты не скажешь, что не сработало, но я рискну догадаться.Вы получаете исключение нулевого указателя где-то.Одна проблема с вашим кодом состоит в том, что вам нужно будет повторить большую часть логики, которую вы используете в onCreate() при выполнении onConfigurationChanged.У вас есть совершенно новый набор представлений в упражнении.В противном случае поле участника tv будет нулевым, и к вашим кнопкам не будут прикреплены прослушиватели.

РЕДАКТИРОВАТЬ Из вашего комментария, что count не сохраняется, яповерьте, что с вашим манифестом что-то не так, и система разрушает и воссоздает вашу активность при смене ориентации.Чтобы сохранить count при таких изменениях, переопределите onRetainNonConfigurationInstance(), чтобы вернуть целое число, содержащее значение count, и получите доступ к этому значению в onCreate(), вызвав getLastNonConfigurationInstance() и приведя его к целому числу.

1 голос
/ 22 ноября 2011

Удалить этот метод

@Override
public void onConfigurationChanged(Configuration newConfig) {
      ....
}

и убедитесь, что вы добавляете в манифест

Android: configChanges = "keyboardHidden | ориентация"

С Counter_demoActivity или еще где-нибудь?

Просто используйте строку ниже и проверьте, воссоздает ли ваша деятельность или нет? Записать строку в вашей деятельности на метод создания, а затем изменить ориентацию. Появляется ли строка в logcat или нет?

андроид: configChanges = "ориентация | клавиатура | keyboardHidden"

0 голосов
/ 23 ноября 2011

Проблема в том, что вы вызываете setContentView внутри вашего onConfigurationChanged.

Если перезаписать onConfigurationChanged и добавить android: configChanges = "клавиатура | клавиатура скрытая | ориентация", ваша деятельность не будет уничтожена и воссоздана, вместо этого будет вызываться onConfigurationChanged. Если вы не реализуете это, вызывается super.onConfigurationChanged. Метод изменения конфигурации суперкласса будет вращать ваш макет, не удаляя значения из всех полей и т. Д. В вашем случае раскладка корректно поворачивается, и после этого вы сбрасываете раскладку самостоятельно, вызывая setContentView(R.layout.main);

0 голосов
/ 23 ноября 2011

Теперь вот решение, которое имеет смысл:)

public class Counter_demoActivity extends Activity {
final private static String COUNT_TITLE = "title";
private int restoredCount;
int count;
TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button add1=(Button)findViewById(R.id.btn1);
    Button sub1=(Button)findViewById(R.id.btn2);
    tv=(TextView)findViewById(R.id.tv1);
    add1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        count++;
        tv.setText("Your Count is " + count);
    }
});
   sub1.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        count--;
        tv.setText("Your Count is " +count);
    }
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(COUNT_TITLE, count);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
     restoredCount =  savedInstanceState.getInt(COUNT_TITLE);
     count=restoredCount;
                 tv.setText("Your Count is " + restoredCount);
    super.onRestoreInstanceState(savedInstanceState);
}

}

...