已记录的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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)