我有一个
public abstract class BaseActivity extends Activity {
protected void setCustomHeader(String title,String subText){
}
}
和two
其他类扩展BaseActivity
类。
public class ListActivity extends BaseActivity {
setCustomHeader("List","Child1");
}
&安培;
public class DetailsActivity extends BaseActivity {
setCustomHeader("Details","Child2");
}
BaseActivity
通常会减少在所有子活动中创建自定义操作栏的代码,这样就可以了。
我希望在某个事件(例如Custom Header
)上更改BaseActivity
中的BroadcastReciever
,以便所有其他ChildActivity
(此处为ListActivity n DetailsActivity)扩展BaseActivity也得到更新。
是否可以仅更改BaseActivity
而无需更改ChildActivity我会根据从Custom Header
收到的事件强制所有childrenActivities更新其Broadcast reciever
?
EDIT:
我不想为每项活动编写接收器,所以我正在尝试这种方法,请建议是否有更好的方法。
答案 0 :(得分:0)
您可以通过多种方式实现这一目标,但所有这些都需要检查BaseActivity onResume()
,以便在实际显示主题时适当地重置主题...... < / p>
首先(我可能会因为暗示这一点而被咀嚼),最快的是使用static variable
包含你想要完成的任何事情的适当值。
private static WhateverData o;
您只需致电:
public static void set(WhateverData o){
BaseActivity.o = o;
}
在Activity's onResume()
方法中,您可以根据当前设置的静态对象重新创建所需的Views
。
为什么这种方法不是最好的?有几个原因。使用非最终静态变量会带来更大的NPE风险(您肯定需要处理值为null的默认情况)并且数据在需要时可能并不总是可用(由于操作系统将其杀死等) )。
现在,更好的方法是使用SharedPreferences
,就像使用静态变量一样。这将确保数据持续存在并始终可用(但是,您仍然应该处理默认的空案例。)
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();
}
然后实际使用它,您可以在onResume()
中覆盖BaseActivity
一次:
@Override
protected void onResume(){
super.onResume();
WhateverData data = BaseActivity.getWhateverData(this);
// Now do something cool with that data
}
显然,您必须实现这些方法来处理WhateverData的任何类型的数据,但我只是想指出您正确的方向......
答案 1 :(得分:0)
当我在广播事件中修改baseActivity
的方法并进行测试时,我意识到所有的孩子都自动更新了,因此得到了我想要的东西。
这就是继承类的目的。
实际上我遇到了一个孩子,孩子们不会从基地更新,因此在未经测试的情况下发布。
PS:只要你遇到任何人,只要永不放弃,你就需要测试你的实施工作。 Lesson learnt
。
答案 2 :(得分:0)
在此BaseActivity中
using System;
namespace Shweta.Question
{
public class User
{ }
public class Permission
{ }
public enum AccessType
{
none,
full,
other
}
public class Roles
{
public static void AddRole(string id, string name)
{
}
}
public class Shweta
{
public void AddUser(string ID, string Name, string Password)
{
///some codes
SaveSecurity();
}
public void DeleteUser(User ObjUser)
{
}
public void AddPermission(string ID, string Name, AccessType Access)
{
}
public void DeletePermission(Permission ObjPermission)
{
}
public void AddRole(string ID, string Name)
{
Roles.AddRole(ID, Name);
}
public void SaveSecurity()
{
///Saves the data
}
public TResult CallMethod<TResult>(Func<TResult> func)
{
try
{
return func();
}
catch (Exception e)
{
// Add Handle Exception
// replace the next line by exception handler
throw e;
}
}
public void CallMethod(Action method)
{
this.CallMethod(() => { method(); return 0; });
this.SaveSecurity();
}
public static void test()
{
var s = new Shweta();
s.CallMethod(() => s.AddRole("theId", "theName"));
s.CallMethod(() => s.DeleteUser(new User()));
s.CallMethod(() => s.AddPermission("theId", "theName", AccessType.full));
s.CallMethod(() => s.DeletePermission(new Permission()));
s.CallMethod(() => s.AddRole("theId", "theName"));
}
}
}
你的孩子活动:
public abstract class BaseActivity {
protected abstract void refresh();
}