更改基本活动以反映所有派生活动的变化?

时间:2015-02-17 17:51:26

标签: java android inheritance android-activity abstract-class

我有一个

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:我不想为每项活动编写接收器,所以我正在尝试这种方法,请建议是否有更好的方法。

3 个答案:

答案 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();
}