
android
简而言之,我们可以说Dashboard是一个页面,其中包含主要功能的大而清晰的符号以及可选的相关新信息区域。
浏览以下文章:
1. UI设计模式–仪表板(摘自Juhani Lehtimaki)2. Android UI设计模式
本文的主要议程是实现与以下相同的Dashboard设计模式:
步骤1:创建标题栏布局
是的,我们仅定义一次标题栏(标题)布局,但在每个屏幕中都需要。 我们将仅在需要时显示/隐藏主页按钮和其他按钮。 定义标题栏布局后,我们可以使用ViewStub在其他布局中使用相同的布局。
这是标题栏(标题)xml布局的示例:header.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@color/title_background" ><LinearLayoutandroid:id="@+id/panelIconLeft"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:layout_margin="5dp" ><Buttonandroid:id="@+id/btnHome"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/ic_home"android:onClick="btnHomeClick" /></LinearLayout><TextViewandroid:id="@+id/txtHeading"style="@style/heading_text"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_marginLeft="5dp"android:layout_marginRight="5dp"android:layout_toLeftOf="@+id/panelIconRight"android:layout_toRightOf="@id/panelIconLeft"android:ellipsize="marquee"android:focusable="true"android:focusableInTouchMode="true"android:gravity="center"android:marqueeRepeatLimit="marquee_forever"android:singleLine="true"android:text=""android:textColor="@android:color/white" /><LinearLayoutandroid:id="@+id/panelIconRight"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_margin="5dp" ><Buttonandroid:id="@+id/btnFeedback"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/ic_feedback"android:onClick="btnFeedbackClick" /></LinearLayout></RelativeLayout>
在上面的布局代码中,我引用了styles.xml中的样式和dimen.xml中的尺寸:
styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="heading_text"><item name="android:textColor">#ff000000</item><item name="android:textStyle">bold</item><item name="android:textSize">16sp</item><item name="android:padding">5dp</item></style>
<style name="HomeButton"><item name="android:layout_gravity">center_vertical</item><item name="android:layout_width">fill_parent</item><item name="android:layout_height">wrap_content</item><item name="android:layout_weight">1</item><item name="android:gravity">center_horizontal</item><item name="android:textSize">@dimen/text_size_medium</item><item name="android:textStyle">normal</item><item name="android:textColor">@color/foreground1</item><item name="android:background">@null</item></style></resources>
dimen.xml
<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="title_height">45dip</dimen><dimen name="text_size_small">14sp</dimen><dimen name="text_size_medium">18sp</dimen><dimen name="text_size_large">22sp</dimen>
</resources>
步骤2:创建超级(抽象)类
实际上,在这个抽象超类中,我们将定义:1)两个按钮的事件处理程序:主页和反馈2)其他方法
“主页”和“反馈”按钮几乎在每个活动中都将可见,并且需要执行相同的操作(即,将用户带到主页活动),因此,我们不必在每个活动中编写一次事件处理程序,而不必在每个活动中编写相同的代码抽象类,它将成为每个活动的超类。
您可能已经在上述header.xml布局中注意到:android:onClick =” btnHomeClick”(主页按钮)和android:onClick =” btnFeedbackClick”(反馈按钮),所以我们将仅在超类(抽象)中定义一次此方法。
如果您不知道它,请参考ViewStub示例。
现在,这里是Abstract(超级)类的代码,我将其称为DashboardActivity.java
package com.technotalkative.viewstubdemo;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewStub;
import android.widget.Button;
import android.widget.TextView;public abstract class DashBoardActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}public void setHeader(String title, boolean btnHomeVisible, boolean btnFeedbackVisible){ViewStub stub = (ViewStub) findViewById(R.id.vsHeader);View inflated = stub.inflate();TextView txtTitle = (TextView) inflated.findViewById(R.id.txtHeading);txtTitle.setText(title);Button btnHome = (Button) inflated.findViewById(R.id.btnHome);if(!btnHomeVisible)btnHome.setVisibility(View.INVISIBLE);Button btnFeedback = (Button) inflated.findViewById(R.id.btnFeedback);if(!btnFeedbackVisible)btnFeedback.setVisibility(View.INVISIBLE);}/*** Home button click handler* @param v*/public void btnHomeClick(View v){Intent intent = new Intent(getApplicationContext(), HomeActivity.class);intent.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);}/*** Feedback button click handler* @param v*/public void btnFeedbackClick(View v){Intent intent = new Intent(getApplicationContext(), FeedbackActivity.class);startActivity(intent);}
}
步骤3:定义仪表板布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><ViewStubandroid:id="@+id/vsHeader"android:layout_width="fill_parent"android:layout_height="wrap_content"android:inflatedId="@+id/header"android:layout="@layout/header" /><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="vertical"android:padding="6dip" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="horizontal" ><Buttonandroid:id="@+id/main_btn_eclair"style="@style/HomeButton"android:drawableTop="@drawable/android_eclair_logo"android:onClick="onButtonClicker"android:text="@string/EclairActivityTitle" /><Buttonandroid:id="@+id/main_btn_froyo"style="@style/HomeButton"android:drawableTop="@drawable/android__logo_froyo"android:onClick="onButtonClicker"android:text="@string/FroyoActivityTitle" /></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="horizontal" ><Buttonandroid:id="@+id/main_btn_gingerbread"style="@style/HomeButton"android:drawableTop="@drawable/android_gingerbread_logo"android:onClick="onButtonClicker"android:text="@string/GingerbreadActivityTitle" /><Buttonandroid:id="@+id/main_btn_honeycomb"style="@style/HomeButton"android:drawableTop="@drawable/android_honeycomb_logo"android:onClick="onButtonClicker"android:text="@string/HoneycombActivityTitle" /></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="horizontal" ><Buttonandroid:id="@+id/main_btn_ics"style="@style/HomeButton"android:drawableTop="@drawable/android_ics_logo"android:onClick="onButtonClicker"android:text="@string/ICSActivityTitle" /><Buttonandroid:id="@+id/main_btn_jellybean"style="@style/HomeButton"android:drawableTop="@drawable/android_jellybean_logo"android:onClick="onButtonClicker"android:text="@string/JellyBeanActivityTitle" /></LinearLayout></LinearLayout>
</LinearLayout>
步骤4:定义用于处理此仪表板布局按钮单击事件的活动。
在此活动中,您会发现使用setHeader()方法来设置主页活动的标题,是的,在此方法中,我已经为主页按钮传递了“ false”,因为它已经是主页活动,但是我已经为传递了“ true”反馈按钮,因为需要使反馈可见。 其他过程与定义按钮单击处理程序相同。
package com.technotalkative.viewstubdemo;import android.content.Intent;
import android.os.Bundle;
import android.view.View;public class HomeActivity extends DashBoardActivity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);setHeader(getString(R.string.HomeActivityTitle), false, true);}/*** Button click handler on Main activity* @param v*/public void onButtonClicker(View v){Intent intent;switch (v.getId()) {case R.id.main_btn_eclair:intent = new Intent(this, Activity_Eclair.class);startActivity(intent);break;case R.id.main_btn_froyo:intent = new Intent(this, Activity_Froyo.class);startActivity(intent);break;case R.id.main_btn_gingerbread:intent = new Intent(this, Activity_Gingerbread.class);startActivity(intent);break;case R.id.main_btn_honeycomb:intent = new Intent(this, Activity_Honeycomb.class);startActivity(intent);break;case R.id.main_btn_ics:intent = new Intent(this, Activity_ICS.class);startActivity(intent);break;case R.id.main_btn_jellybean:intent = new Intent(this, Activity_JellyBean.class);startActivity(intent);break;default:break;}}
}
步骤5:定义其他活动及其UI布局
现在,是时候根据仪表板上的特定按钮单击来定义我们要显示的活动了。 因此,定义每个活动及其布局。 不要忘记在必要时调用setHeader()方法。
这是此类活动的一个示例– Activity_Eclair.java
package com.technotalkative.viewstubdemo;import android.os.Bundle;public class Activity_Eclair extends DashBoardActivity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_eclair);setHeader(getString(R.string.EclairActivityTitle), true, true);}
}
activity_eclair.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><ViewStubandroid:id="@+id/vsHeader"android:layout_width="fill_parent"android:layout_height="wrap_content"android:inflatedId="@+id/header"android:layout="@layout/header" /><TextViewandroid:id="@+id/textView1"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="@string/EclairActivityTitle" /></LinearLayout>
步骤6:在AnroidManifest.xml文件中声明活动
现在你完成了

输出:
|
主画面_风景 |
|
内屏 |
| |
|
您可以从此处下载源代码: Android –仪表板模式实现
随时欢迎反馈/评论

参考: Android –我们的JCG合作伙伴Paresh N. Mayani在TechnoTalkative博客上实现了仪表板设计模式。
翻译自: https://www.javacodegeeks.com/2012/06/android-dashboard-design-pattern.html
android