更改基础 Activity 以反映所有派生活动的更改?

Making change in Base Activity to reflect changes in All derived Activities?

我有一个

public abstract class BaseActivity extends Activity {

protected void setCustomHeader(String title,String subText){
   }
}

two其他类扩展BaseActivityclass.

public class ListActivity extends BaseActivity {
           setCustomHeader("List","Child1");
}

&

public class DetailsActivity extends BaseActivity {
         setCustomHeader("Details","Child2");
}

BaseActivity通常会减少在所有子活动中创建自定义操作栏的代码,效果很好。

我希望在某些事件(例如 BroadcastReciever)中更改 BaseActivity 中的 Custom Header,以便所有其他 ChildActivity(此处为 ListActivity n DetailsActivity)扩展BaseActivity 也得到更新。

是否可以仅更改 BaseActivity 而无需更改 ChildActivity 我强制所有 childrenActivities 根据从 Broadcast reciever 收到的事件更新其 Custom Header

EDIT: 我不想为每个 activity 都写一个接收器,所以我正在尝试这种方法,如果有更好的方法,请提出建议。

您可能可以通过多种方式实现这一点,但所有这些都需要检查 BaseActivity 的 onResume() 以在实际显示时适当地重置主题...

首先(我可能会因为提出这个建议而被责骂)而且最快的方法是使用 static variable,其中包含您要完成的任何事情的适当值。

private static WhateverData o;

您只需致电:

public static void set(WhateverData o){
    BaseActivity.o = o;
}

并且在您的 Activity's onResume() 方法中,您可以根据当前设置的静态对象重新创建任何您想要的 Views

为什么这种方法不是最好的?有几个原因。使用非最终静态变量会带来更大的 NPE 风险(您肯定需要处理值为 null 的默认情况)并且数据在需要时可能并不总是可用(由于 OS 杀死它等.).

现在,更好的方法可能是像使用静态变量一样使用 SharedPreferences。这将确保数据持续存在并始终可用(但是,同样,您仍应处理默认的 null 情况)。

public static WhateverData getWhateverData(Context context){
    return context.getSharedPreferences(BaseActivity.class.getName(), 0).getWhateverData("data_key", default);
}

public static void setWhateverData(Context context, WhateverData o){
    context.getSharedPreferences(BaseActivity.class.getName(), 0).edit().putWhateverData("data_key", o).commit();
} 

然后为了实际使用它,您只需在 BaseActivity:

中覆盖 onResume() 一次
@Override
protected void onResume(){
    super.onResume();
    WhateverData data = BaseActivity.getWhateverData(this);
    // Now do something cool with that data
}

很明显,您必须实施这些方法来处理任何类型的数据 WhateverData,但我只是想为您指明正确的方向...

当我在广播事件上修改 baseActivity 的方法并进行测试时,我意识到所有 children 都自动更新了,因此得到了我想要的东西。

这是继承 类 的目的。

实际上有人告诉我 children 不会从 Base 更新,因此未经测试就发布了。

PS: 遇到任何人都不要放弃,你需要测试你的实现是否有效。

Lesson learnt.

在这个基地Activity

public abstract class BaseActivity {
  protected abstract void refresh();
}

还有你的childActivity:

public class YourActivity extends BaseActivity {
   protected void refresh(){
    // This your code
    }
}