片段,扩展基类和包含有什么区别?

时间:2016-08-10 14:02:47

标签: java android android-fragments android-include

我是Android新手,我正在尝试了解如何制作可与之互动的可重复使用的UI片段。我知道有一些技术,但我不明白什么时候会比另一个好,或者它们都可以互换使用。如果有人可以指出差异(或者如果我被误解了),那将不胜感激。

  1. 创建负责新页面的片段或fragmentActivity。然后,只要适用,就可以使用该片段,但必须特别注意处理片段生命周期。
  2. 扩展具有布局的基类以及其他必要的基类。然后,任何其他类都可以扩展此基础并使基本UI也显示并起作用。
  3. 使用<include layout=...可以仅重复使用部分UI。对于这个,我不确定该布局的逻辑应该去哪里。
  4. 我想我要求的是每一项都要失败,如果我可以使用任何一个我更舒服的而不会产生任何负面影响。

    Ps:我正在使用这些来创建可重复使用的导航栏,我可以放在每个页面上,或者如果不同的页面都有帮助按钮。

1 个答案:

答案 0 :(得分:1)

您建议的每种方法对于创建可重用的用户界面都是必不可少的,并且每种方法都有不同的用途。

首先,layouts只定义用户界面的可视结构,而activitiesfragments是定义视觉结构行为方式的组件。这在视觉结构和用户界面的行为之间创造了清晰的分离。

因此,<include/>标记用于重用已定义的可视结构。此可视化结构可以包含在任何布局中,但每个活动或片段都可以定义该可视化结构的单独行为。

为了创建可重用的行为,您可以继承Activity。例如; FragmentActivity保留Activity类中定义的行为,但增加了容纳一个或多个片段的能力。子类FragmentActivity的任何类都将保留这些行为。

片段被开发为Activity的可重用片段,并且可以定义他们自己的视觉结构和行为。因此,如果您希望能够重用Activity部分的视觉结构和行为,则可以创建Fragment以执行此操作。片段也可以是子类,这可以用来修改扩展类的视觉结构,行为或两者。

这些并不是创建可重用接口的唯一方法。您可以定义可重用资源,视图,样式或动画以创建模块化用户界面。学习如何利用这些不同的组件来满足您的需求是Android开发(以及一般开发)的重要组成部分。

最后,我将解决你的帖子脚本;如何为每个页面创建可重用的导航栏,其中包括一个帮助按钮。希望这将显示一种创建可重用接口的简单方法,并且它不是一项艰巨的任务。

为每个Activity实现可重用的 help 按钮的一种方法是创建一个menu资源,该资源可用作基类中的选项菜单:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item android:id="@+id/action_help" android:title="@string/action_help"
        android:icon="@drawable/ic_help_white_24dp" android:orderInCategory="100"
        app:showAsAction="ifRoom"/>

</menu>

然后此菜单资源在基类中膨胀。基类扩展AppCompatActivity(扩展FragmentActivity)以便使用Support Library

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.base, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.action_help:
                dispatchHelpIntent();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    protected void dispatchHelpIntent() {
        // Handle help options button
    }

}

使用此功能,您可以在基类中处理 help 按钮,或者让子类覆盖dispatchHelpIntent()以单独处理它。您还可以覆盖子类中的onCreateOptionsMenu()onOptionsItemSelected(),以向菜单中添加更多项。只需确保在这两种方法中调用super,就像我在这里一样,以保留帮助按钮。

接下来,要创建一个可重复使用的导航栏(在Android中通常称为App Bar),您所要做的就是创建一个layout文件,该文件将包含在layout文件中对于每个Activity

<android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/app_bar"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar android:id="@+id/toolbar"
        android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay"/>

</android.support.design.widget.AppBarLayout>

然后,您可以使用Activity标记在任何其他<include/>中添加此布局:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent" android:layout_height="match_parent"/>

    <include layout="@layout/app_bar_base"/>

    <!-- Activity content goes here -->

</android.support.design.widget.CoordinatorLayout>

最后将ActionBar(“操作栏”是App Bar的旧术语)添加到Activity扩展BaseActivity的所有public class MainActivity extends BaseActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); setupActionBar(); } private void setupActionBar() { ActionBar actionBar = getSupportActionBar(); if(actionBar != null) { actionBar.setDisplayShowTitleEnabled(true); } } } 中:

BaseActivity

Activity中无法完成此操作的原因是,除非每个Activity使用相同的布局,否则每个setContentView()必须使用Toolbar定义自己的布局。在设置内容视图之前,anyMultipleOf将不可用,因此您必须使用此方法分别在每个活动中设置操作栏(App Bar)。