如何在不违反OO核心原则的情况下使用Fragments?

如何在不违反OO核心原则的情况下使用Fragments?,第1张

概述已记录的Android片段示例(FragmentBasics,NewsReader违反了面向对象设计的核心原则.存在多余的条件来建立当前显示的视图类型,将FragmentActivity与视图类型和片段类型紧密耦合.MainActivity耦合到每个类(包括XML):一个人也许可以为作者试图“保持简单”的借口,或者使读者感到困惑.

已记录的Android片段示例(FragmentBasics,NewsReader违反了面向对象设计的核心原则.存在多余的条件来建立当前显示的视图类型,将FragmentActivity与视图类型和片段类型紧密耦合.MainActivity耦合到每个类(包括XML):

一个人也许可以为作者试图“保持简单”的借口,或者使读者感到困惑.如果是这样的话,我认为读者可以处理;取而代之的是,它教授不良的编程习惯,这将导致应用程序难以维护.

如何实现片段,以使视图和片段与FragmentActivity不紧密耦合?

解决方法:

从更简单的FragmentBasics演示开始,按如下方式保留MainActivity:

public class MainActivity extends FragmentActivity      implements OnheadlineselectedListener {   AbstractNewsVIEw abstractNewsVIEw;   @OverrIDe public voID onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);      setContentVIEw(R.layout.news_articles);      abstractNewsVIEw = new AbstractNewsVIEwProvIDer(this).get();      abstractNewsVIEw.onCreate(savedInstanceState);   }   @OverrIDe public voID onArticleSelected(int position) {      abstractNewsVIEw.onArticleSelected(position);   }}

现在,其依赖关系图如下所示.现在,您可以为所有不同的设备类型添加所需的所有news_articles视图变体,并且MainActivity无需更改.

添加一个新类AbstractNewsVIEwProvIDer,其唯一职责是确定给定设备使用哪种视图类型(单窗格或双窗格).如果您使用Guice或RoboGuice进行依赖项注入,那么它将是绑定模块中的Provider方法.

public class AbstractNewsVIEwProvIDer {   private final FragmentActivity fragmentActivity;   public AbstractNewsVIEwProvIDer(FragmentActivity activity) {      this.fragmentActivity = activity;   }   public AbstractNewsVIEw get() {      if (fragmentActivity.findVIEwByID(R.ID.fragment_container) != null) {           return new SinglePaneNewsVIEw(fragmentActivity);        } else {           return new DoublePaneNewsVIEw(fragmentActivity);        }   }}

添加两个新类SinglePaneNewsVIEw和DoublePaneNewsVIEw,它们实现AbstractNewsVIEw,如下所示.这两个类负责在各自的视图类型内设置初始片段.它们还负责处理片段之间的过渡(如果有).

interface AbstractNewsVIEw extends OnheadlineselectedListener {   public voID onCreate(Bundle savedInstanceState);   @OverrIDe public voID onArticleSelected(int position);}public class SinglePaneNewsVIEw implements AbstractNewsVIEw {   private final FragmentActivity fragmentActivity;   public SinglePaneNewsVIEw(FragmentActivity fragmentActivity) {      this.fragmentActivity = fragmentActivity;   }   @OverrIDe public voID onCreate(Bundle savedInstanceState) {      // However, if we're being restored from a prevIoUs state,      // then we don't need to do anything and should return or else      // we Could end up with overlapPing fragments.      if (savedInstanceState != null) {         return;      }      // Create an instance of ExampleFragment      headlinesFragment firstFragment = new headlinesFragment();      // In case this activity was started with special instructions from an      // Intent,      // pass the Intent's extras to the fragment as arguments      firstFragment.setArguments(fragmentActivity.getIntent().getExtras());      // Add the fragment to the 'fragment_container' FrameLayout      fragmentActivity.getSupportFragmentManager().beginTransaction()            .add(R.ID.fragment_container, firstFragment).commit();   }   @OverrIDe public voID onArticleSelected(int position) {      // If the frag is not available, we're in the one-pane layout and must      // swap frags...      // Create fragment and give it an argument for the selected article      ArticleFragment newFragment = new ArticleFragment();      Bundle args = new Bundle();      args.putInt(ArticleFragment.ARG_position, position);      newFragment.setArguments(args);      FragmentTransaction transaction =            fragmentActivity.getSupportFragmentManager().beginTransaction();      // Replace whatever is in the fragment_container vIEw with this fragment      // Add the transaction to the back stack so the user can navigate back      transaction.replace(R.ID.fragment_container, newFragment);      transaction.addToBackStack(null);      // Commit the transaction      transaction.commit();   }public class DoublePaneNewsVIEw implements AbstractNewsVIEw {   private final FragmentActivity fragmentActivity;   public DoublePaneNewsVIEw(FragmentActivity fragmentActivity) {      this.fragmentActivity = fragmentActivity;   }   @OverrIDe public voID onCreate(Bundle savedInstanceState) {   }   @OverrIDe public voID onArticleSelected(int position) {      ((ArticleFragment) fragmentActivity.getSupportFragmentManager()         .findFragmentByID(R.ID.article_fragment)).updateArticleVIEw(position);   }}

您可以在Google代码上找到complete source.

总结

以上是内存溢出为你收集整理的如何在不违反OO核心原则的情况下使用Fragments?全部内容,希望文章能够帮你解决如何在不违反OO核心原则的情况下使用Fragments?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1075251.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存