Переход между действиями в группе действий
Я разрабатываю приложение, которое содержит TabHost
в одной из этих вкладок у меня есть ActivityGroup
и из этого ActivityGroup
я запускаю другую SubActivity
(скажем, я запускаю Activity
А) и до этого все ок.
Проблема заключается в том, когда я нажимаю кнопку BackButton, CurrentActivity (Activity
A) уничтожается, но ParentActivity(ActivityGroup
) не возобновляется, и приложение отображает только нулевое окно с названием моего приложения ( " Название моего приложения ") .
Код для запуска Activity
А из моего ActivityGroup
является:
View view = getLocalActivityManager().startActivity(id,newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView();
this.setContentView(view);
и я имею overrided
метод onKeyDown
как это в моем ActivityGroup
:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.i(TAG, "onKeyDown");
if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
Activity current = getLocalActivityManager().getCurrentActivity();
Log.i(TAG, current.getIntent().getStringExtra("id"));
current.finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
но похоже что метод onKeyDown
никогда не вызывается, потому что ai не отображал журнал "onKeyDown".
и logcat отображает только это:
01-05 11:04:38.012: W/KeyCharacterMap(401): No keyboard for id 0
01-05 11:04:38.012: W/KeyCharacterMap(401): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
что я хочу, чтобы отобразить ActivityGroup
когда мой Activity
А уничтожен.
NB: мой уровень приложения 4: * Android 1.6 *, поэтому я не могу override
метод onBackPressed()
Спасибо за вашу помощь
-----------------------------------РЕДАКТИРОВАТЬ -------------- --------------------------
Я добавил код моего onKeyDown
как это на моем Activity
A:
@Override public boolean onKeyDown (int keyCode, событие KeyEvent) {
if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
ParentActivity parentActivity = (ParentActivity) this.getParent();
parentActivity.onKeyDown(keyCode, event);
return true;
}
return super.onKeyDown(keyCode, event);
}
И по моему ParentActivity
, я имею:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
Log.i(TAG, "onKeyDown");
int len = idOfSubActivities.size();
String idOfCurrentActivity = idOfSubActivities.get(len-1);
Activity currentActivity = getLocalActivityManager().getActivity(idOfCurrentActivity);
currentActivity.finish();
idOfSubActivities.remove(len - 1);
return true;
}
return super.onKeyDown(keyCode, event);
}
Я получил тот же результат, Activity
A остановлен, но он по-прежнему дает мне пустое окно с названием моего приложения, и он не отображает мой ActivityGroup
(ParentActivity
)
1 ответ
Я столкнулся с проблемой, похожей на эту, когда я впервые начал экспериментировать с ActivityGroup
s. Проблема в том, что вам нужно разместить onKeyDown()
в вашем Activity
, Тем не менее, вам нужно Activity
иметь ссылку на ActivityGroup
, Затем, когда вы нажимаете обратно, просто позвоните своему onBack()
в ActivityGroup
,
(РЕДАКТИРОВАТЬ) Вот образец для вас
Ниже приведен урезанный код ActivityGroup, который обрабатывает навигацию и историю в моих приложениях. Он был скорректирован на лету, поэтому может быть ошибка. Обратите внимание на пару тонких моментов.
public class MyGroup extends ActivityGroup
{
/** Static Reference to this Group. */
static MyGroup instance;
/** Keeps Track of the History as a Stack. */
private ArrayList<View> myActivityHistory;
@Override protected void onCreate(final Bundle savedInstanceState)
{//Call the Base Implementation
super.onCreate(savedInstanceState);
// Initialize the Activity History
myActivityHistory = new ArrayList<View>();
// Build the Intent
Intent _root = null;
//Lists the Applications
_root = new Intent(this, MyActivity.class);
// Send the Index to the Child Activity
_root.setAction(Intent.ACTION_VIEW);
// Forward the Extras, if they are there
// Start the root Activity within the Group and get its View
final View _view = getLocalActivityManager().startActivity("App Preferences", _root).getDecorView();
// Start the History
addNewLevel(_view);
}
/**
* Gets the instance of the {@link ApplicationGroup} that the child Activity
* belongs to.
*
* @param index
* The Group that was passed to the child in the {@link android.content.Intent
* Intent} via an Extra (int).
* @return
* <b>ApplicationGroup -</b> The group that this child was assigned to.
*/
static public ApplicationGroup getGroup()
{ if (instance != null)
return instance;
}
/**
* Allows the Child to replace the {@link ApplicationGroup}'s current
* {@link android.view.View View} with the specified View. This is
* intended to be used specifically by the Child.
*
* @param withView
* The View to use for replacement.
*/
public void addNewLevel(final View withView)
{//Adds the old one to history
myActivityHistory.add(withView);
// Changes this Groups View to the new View.
setContentView(withView);
}
/**
* Takes the specified {@link android.app.ActivityGroup ActivityGroup} back
* one step in the History to the previous {@link android.view.View View}.
*/
public void back()
{ Log.d("Group", "Back overridden");
//If there are more than one screen
if (myActivityHistory.size() > 1)
{ Log.d("Group", "History called");
// Remove the most recent View
myActivityHistory.remove(myActivityHistory.size()-1);
// Change the View back.
setContentView(myActivityHistory.get(myActivityHistory.size()-1));
}
// Otherwise Exit
else
{ Log.d("Group", "Program finished");
finish();
}
}
}
Далее приведен соответствующий код для действия:
public boolean onKeyDown(int keyCode, KeyEvent event)
{//If back was pressed
if (keyCode==KeyEvent.KEYCODE_BACK)
{ MyGroup.getGroup().back();
return true;
}
return super.onKeyDown(keyCode, event);
}
Просто убедитесь, что вы не устанавливаете KeyDownListener на что-нибудь смешное, и оно должно работать нормально.:) Изменения, которые я сделал, состоят в том, что они на самом деле находятся в массиве групп (по 3 одновременно). По сути, просто сделайте Группу синглтоном, чтобы у вас всегда был один и тот же экземпляр, и сохраните массив ваших представлений, чтобы у вас была история. Затем ссылаться на историю, когда вы нажимаете кнопку Назад или когда вы добавляете вид.
Надеюсь, это поможет, FuzzicalLogic