片段、扩展基础 class 和包含之间有什么区别?
What is the difference between fragment, extending a base class, and includes?
我是 android 的新手,我正在尝试了解如何制作可重复使用的 UI 我可以与之互动的作品。我知道那里有一些技术,但我不明白什么时候一种技术会比另一种更好,或者它们是否可以互换使用。如果有人能指出差异(或者如果我误解了),那将不胜感激。
- 正在创建负责新页面的片段或片段活动。然后可以在任何适用的时候使用这个片段,但必须特别注意片段的生命周期。
- 扩展基础 class,其中包含布局和任何其他必要的内容。然后任何其他 class 都可以扩展此基础并使基础 UI 也出现并起作用。
- 使用
<include layout=...
可以让您仅重复使用 UI 的片段。对于这个,我不确定该布局的逻辑应该去哪里。
我想我要的是 运行 中的每一个,如果我可以使用我更喜欢的任何一个而不会产生任何负面影响。
Ps:我会使用它们来创建可重复使用的导航栏,我可以将其放在每个页面上,或者如果不同的页面都有帮助按钮。
您建议的每种方法对于创建可重用的用户界面都是必不可少的,并且每种方法都有不同的用途。
首先,layouts just define the visual structure of a user interface, while activities and fragments 是定义视觉结构如何运作的组件。这在视觉结构和用户界面的行为之间创建了清晰的分离。
因此,<include/>
标签用于重用已定义的视觉结构。这种视觉结构可以包含在任何布局中,但每个 activity 或片段都可以单独定义该视觉结构的行为方式。
为了创建可重复使用的行为,您可以 class 子Activity
。例如; FragmentActivity
保留了 Activity
class 中定义的行为,但增加了容纳一个或多个片段的能力。任何 class subclasses FragmentActivity
也将保留这些行为中的每一个。
片段被开发为 Activity
的可重用片段,并且可以定义它们自己的视觉结构和行为。因此,如果您希望能够重用 Activity
的一部分的视觉结构和行为,您可以创建一个 Fragment
来实现。片段也可以被子class编辑,这可用于修改扩展class.
的视觉结构、行为或两者。
而且这些并不是创建可重用界面的唯一方法。您可以定义可重复使用的资源、视图、样式或动画来创建模块化用户界面。学习如何利用这些不同的组件来满足您的需求是 Android 开发(以及一般开发)的重要组成部分。
最后,我将解决您的 post 脚本问题;如何为每个页面创建一个可重复使用的导航栏,其中包括一个帮助按钮。希望这将展示一种创建可重用界面的简单方法,并且这不是一项艰巨的任务。
为每个 Activity
实现可重复使用的 help 按钮的一种方法是创建一个 menu
资源,该资源可用作基地 class:
<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>
然后这个菜单资源在基础 class 中膨胀。基础 class 扩展 AppCompatActivity
(which extends FragmentActivity
) in order to make use of the 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
}
}
有了这个,您可以处理 帮助 按钮在基础 class 中的点击,或者让 child class 覆盖 dispatchHelpIntent()
单独处理。您还可以覆盖 child class 中的 onCreateOptionsMenu()
和 onOptionsItemSelected()
以向菜单添加更多项目。只需确保在这两种方法中调用 super
,就像我在这里所做的那样,以保留 help 按钮。
接下来,要创建一个可重复使用的导航栏(通常在 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>
然后您可以使用 <include/>
标签将此布局包含在任何其他 Activity
中:
<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
("Action Bar" 是 App Bar 的旧术语)在扩展 BaseActivity
的任何 Activity
中:
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
只有在content view设置好后才能使用,所以必须用这个方法在每个activity中分别设置Action Bar(App Bar)。
我是 android 的新手,我正在尝试了解如何制作可重复使用的 UI 我可以与之互动的作品。我知道那里有一些技术,但我不明白什么时候一种技术会比另一种更好,或者它们是否可以互换使用。如果有人能指出差异(或者如果我误解了),那将不胜感激。
- 正在创建负责新页面的片段或片段活动。然后可以在任何适用的时候使用这个片段,但必须特别注意片段的生命周期。
- 扩展基础 class,其中包含布局和任何其他必要的内容。然后任何其他 class 都可以扩展此基础并使基础 UI 也出现并起作用。
- 使用
<include layout=...
可以让您仅重复使用 UI 的片段。对于这个,我不确定该布局的逻辑应该去哪里。
我想我要的是 运行 中的每一个,如果我可以使用我更喜欢的任何一个而不会产生任何负面影响。
Ps:我会使用它们来创建可重复使用的导航栏,我可以将其放在每个页面上,或者如果不同的页面都有帮助按钮。
您建议的每种方法对于创建可重用的用户界面都是必不可少的,并且每种方法都有不同的用途。
首先,layouts just define the visual structure of a user interface, while activities and fragments 是定义视觉结构如何运作的组件。这在视觉结构和用户界面的行为之间创建了清晰的分离。
因此,<include/>
标签用于重用已定义的视觉结构。这种视觉结构可以包含在任何布局中,但每个 activity 或片段都可以单独定义该视觉结构的行为方式。
为了创建可重复使用的行为,您可以 class 子Activity
。例如; FragmentActivity
保留了 Activity
class 中定义的行为,但增加了容纳一个或多个片段的能力。任何 class subclasses FragmentActivity
也将保留这些行为中的每一个。
片段被开发为 Activity
的可重用片段,并且可以定义它们自己的视觉结构和行为。因此,如果您希望能够重用 Activity
的一部分的视觉结构和行为,您可以创建一个 Fragment
来实现。片段也可以被子class编辑,这可用于修改扩展class.
而且这些并不是创建可重用界面的唯一方法。您可以定义可重复使用的资源、视图、样式或动画来创建模块化用户界面。学习如何利用这些不同的组件来满足您的需求是 Android 开发(以及一般开发)的重要组成部分。
最后,我将解决您的 post 脚本问题;如何为每个页面创建一个可重复使用的导航栏,其中包括一个帮助按钮。希望这将展示一种创建可重用界面的简单方法,并且这不是一项艰巨的任务。
为每个 Activity
实现可重复使用的 help 按钮的一种方法是创建一个 menu
资源,该资源可用作基地 class:
<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>
然后这个菜单资源在基础 class 中膨胀。基础 class 扩展 AppCompatActivity
(which extends FragmentActivity
) in order to make use of the 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
}
}
有了这个,您可以处理 帮助 按钮在基础 class 中的点击,或者让 child class 覆盖 dispatchHelpIntent()
单独处理。您还可以覆盖 child class 中的 onCreateOptionsMenu()
和 onOptionsItemSelected()
以向菜单添加更多项目。只需确保在这两种方法中调用 super
,就像我在这里所做的那样,以保留 help 按钮。
接下来,要创建一个可重复使用的导航栏(通常在 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>
然后您可以使用 <include/>
标签将此布局包含在任何其他 Activity
中:
<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
("Action Bar" 是 App Bar 的旧术语)在扩展 BaseActivity
的任何 Activity
中:
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
只有在content view设置好后才能使用,所以必须用这个方法在每个activity中分别设置Action Bar(App Bar)。