首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TabActivity与嵌入式activity之间的通信

TabActivity与嵌入式activity之间的通信
EN

Stack Overflow用户
提问于 2010-06-29 01:45:28
回答 5查看 7.1K关注 0票数 3

我正在尝试找出在这个TabActivity中嵌入的TabActivity和子活动之间通信的最佳实践。

在我的TabActivity中,有一个按钮。单击按钮时,我希望更新嵌入到此TabActivity中的子活动。我像下面这样写了代码,只是想知道这是不是一个好的做法。谢谢。

MyTabActivity.java

代码语言:javascript
复制
public class MyTabActivity extends TabActivity implements OnClickListener {
    private TabHost m_tabHost;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ff_tab_activity);

    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    m_tabHost = getTabHost(); 
    TabHost.TabSpec spec; 
    Intent intent; 

    intent = new Intent().setClass(this, ChildActivity.class);
    spec = m_tabHost.newTabSpec("Tab 1");
    spec.setContent(intent);
    tabView = (TextView) inflater.inflate(R.layout.tab_indicator, null);
    spec.setIndicator(tabView);
    m_tabHost.addTab(spec);

    m_tabHost.setCurrentTab(0);
    ImageView nextButtonIv = (ImageView) findViewById(R.id.next_button);
    nextButtonIv.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
    switch (v.getId()) {
    case R.id.next_button:
        synchronized (ChildActivity.class) {
            if (null != ChildActivity.s_childActivity) {
                ChildActivity.s_childActivity.changeUI();
            }
        }
        break;
    }
}

ChildActivity.java

代码语言:javascript
复制
public class ChildActivity extends Activity {
    public static ChildActivity s_childActivity;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        synchronized (MatchupsActivity.class) {
            s_childActivity = this;
        }
        setContentView(R.layout.child_activity);
    }

    public void changeUi() {
        code that changes UI
    }

    protected void onDestroy() {
        super.onDestroy();

        synchronized (MatchupsActivity.class) {
            s_childActivity = null;
        }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-29 02:06:30

看起来很好。以下是几个注意事项:

我认为没有理由让synchronization.

  • I'd替换

代码语言:javascript
复制
ChildActivity.s_childActivity.changeUI();

使用

代码语言:javascript
复制
if(ChildActivity.s_childActivity != null){
    ChildActivity.s_childActivity.changeUI();
}

甚至是

代码语言:javascript
复制
try{
    ChildActivity.s_childActivity.changeUI();
} catch(Exception e){
    //log
}

为了增加偏执狂的安全性。:)

票数 2
EN

Stack Overflow用户

发布于 2010-09-28 04:23:22

由于TabActivity是一个ActivityGroup,我将使用以下方法之一:

  • getCurrentActivity()

返回正在显示的子选项卡活动。在本例中,此方法将返回正在使用的ChildActivity实例。

代码语言:javascript
复制
ChildActivity childActivity = (ChildActivity) getCurrentActivity();

  • getLocalActivityManager().getActivity(String)

返回给定ID/选项卡规范名称的子选项卡活动,无论显示的是什么活动。

代码语言:javascript
复制
ChildActivity childActivity = (ChildActivity) getLocalActivityManager().getActivity("Tab 1");

我建议在ChildActivity中重写onNewIntent(Intent):

代码语言:javascript
复制
Intent intent = new Intent();
intent.putExtra("xyz", "whatever"); // or a serializable

ChildActivity childActivity = (ChildActivity) getLocalActivityManager().getActivity("Tab 1");
childActivity.onNewIntent(intent);

如果有效,请让我知道!

票数 7
EN

Stack Overflow用户

发布于 2011-05-20 17:45:22

上面的方法是

代码语言:javascript
复制
ChildActivity childActivity = (ChildActivity) getLocalActivityManager().getActivity("Tab 1");
childActivity.onNewIntent(intent);

不是很好。而不是直接调用您的活动方法(它可以是null!)最好这样做:

代码语言:javascript
复制
Intent intent = new Intent(this, ChildActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra(AlbumBrowser.INTENT_EXTRA_FILTER, mediaTitle);
getLocalActivityManager().startActivity("activityIdHere", intent);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3134783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档