APP设计与开发(ui篇)
這篇文章是我個(gè)人在開發(fā)與設(shè)計(jì)APP的所用的一些設(shè)計(jì)思路,僅用于和大家分享知識(shí)并不是什么設(shè)計(jì)標(biāo)準(zhǔn)之類的。主要說明App的開發(fā)中是如何來開發(fā)與組織UI部分。
UI模塊結(jié)構(gòu)
在項(xiàng)目中建立ui包用于存放ui類文件。這是第一步第二步是建立相應(yīng)的組件包名: activity、fragment、widget、adapter、widget等以上是最基本的組件現(xiàn)在ui結(jié)構(gòu)如下:
基類設(shè)計(jì)
base存放ui通用的部分,結(jié)構(gòu)如下:
UIDelegate
定義一些常用的UI操作如: Toast、Dialog、獲取Resources等功能。
public interface UIDelegate {
Toast makeToast(String msg, int len);
void showToastShort(String msg);
void showToastLong(String msg);
void showToastShort(@StringRes int msg);
void showToastLong(@StringRes int msg);
Dialog showWaitDialog(@StringRes int msg);
Dialog showWaitDialog(String msg);
Dialog showWaitDialog(@NonNull String msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback);
Dialog showWaitDialog(@StringRes int msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback);
void dismissWaitDialog();
}
BaseActivity
繼承Activity實(shí)現(xiàn)最基本的功能如打印生命周期、獲取參數(shù)等BaseActivity實(shí)現(xiàn)UIDelegate提供最基本的Toast與Dialog顯示功能部分代碼如下:
public abstract class BaseActivity extends AppCompatActivity implements UIDelegate{
private static final String ACTIVITY_LIFE_CYCLE_TAG = "activity_life_cycle";
private static final String LOG_FORMAT = "%s: %s";
private ProgressDialog mWaitDialog;
// activity life cycle start
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LianLianLog.d(ACTIVITY_LIFE_CYCLE_TAG, LOG_FORMAT, this.getLocalClassName(), "onCreate");
ActivityStack.getActivityStack().addActivity(this);
}
@SuppressWarnings("unchecked")
public <T> T getExtra(String key, T defaultValue){
Bundle bundle = getIntent().getExtras();
if(bundle != null && bundle.containsKey(key)){
return (T) bundle.get(key);
}
return defaultValue;
}
@SuppressWarnings("unchecked")
public <T> T getExtra(String key){
Bundle bundle = getIntent().getExtras();
if(bundle != null && bundle.containsKey(key)){
return (T) bundle.get(key);
}
return null;
}
@Override
public Toast makeToast(String msg, int len) {
if(TextUtils.isEmpty(msg))
return null;
return Toast.makeText(this, msg, len);
}
@Override
public void showToastShort(String msg) {
Toast toast = makeToast(msg, Toast.LENGTH_SHORT);
if(toast != null)
toast.show();
}
@Override
public void showToastLong(String msg) {
makeToast(msg, Toast.LENGTH_LONG).show();
Toast toast = makeToast(msg, Toast.LENGTH_LONG);
if(toast != null)
toast.show();
}
@Override
public void showToastShort(@StringRes int msg) {
showToastShort(getString(msg));
}
@Override
public void showToastLong(@StringRes int msg) {
showToastLong(getString(msg));
}
@Override
public Dialog showWaitDialog(@StringRes int msg) {
return showWaitDialog(getString(msg));
}
@Override
public Dialog showWaitDialog(String msg) {
return showWaitDialog(msg, false, null);
}
@Override
public Dialog showWaitDialog(@NonNull String msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback) {
if(mWaitDialog == null) {
mWaitDialog = ProgressDialog.show(this, null, msg, true, cancelable, callback);
mWaitDialog.setCanceledOnTouchOutside(false);
}else{
mWaitDialog.setMessage(msg);
mWaitDialog.show();
}
return mWaitDialog;
}
@Override
public Dialog showWaitDialog(@StringRes int msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback) {
return showWaitDialog(getString(msg), cancelable, callback);
}
@Override
public void dismissWaitDialog() {
if(mWaitDialog != null)
mWaitDialog.dismiss();
mWaitDialog = null;
}
}
BaseFragment
同樣也實(shí)現(xiàn)UIDelegate接口但是他的功能其實(shí)是由BaseActivity去完成的部分代碼如下:
public class BaseFragment extends Fragment implements UIDelegate {
private static final String FRAGMENT_LIFE_CYCLE_TAG = "fragment_life_cycle";
private static final String LOG_FORMAT = "%s: %s";
private UIDelegate mDelegate;
@Override
public void onAttach(Context context) {
super.onAttach(context);
LianLianLog.d(FRAGMENT_LIFE_CYCLE_TAG, LOG_FORMAT, getLogTag(), "onAttach");
if(context instanceof UIDelegate)
mDelegate = (UIDelegate) context;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
LianLianLog.d(FRAGMENT_LIFE_CYCLE_TAG, LOG_FORMAT, getLogTag(), "onActivityCreated");
}
@SuppressWarnings("unchecked")
public <T> T getExtra(String key, T defaultValue){
Bundle bundle = getArguments();
if(bundle != null && bundle.containsKey(key)){
return (T) bundle.get(key);
}
return defaultValue;
}
@SuppressWarnings("unchecked")
public <T> T getExtra(String key){
Bundle bundle = getArguments();
if(bundle != null && bundle.containsKey(key)){
return (T) bundle.get(key);
}
return null;
}
private String getLogTag() {
return getTag() != null ? getTag() : getClass().getSimpleName();
}
@Override
public Toast makeToast(String msg, int len) {
return mDelegate != null ? mDelegate.makeToast(msg, len) : null;
}
@Override
public void showToastShort(String msg) {
if(mDelegate != null)
mDelegate.showToastShort(msg);
}
@Override
public void showToastLong(String msg) {
if(mDelegate != null)
mDelegate.showToastLong(msg);
}
@Override
public void showToastShort(@StringRes int msg) {
if(mDelegate != null)
mDelegate.showToastShort(msg);
}
@Override
public void showToastLong(@StringRes int msg) {
if(mDelegate != null)
mDelegate.showToastLong(msg);
}
@Override
public Dialog showWaitDialog(@StringRes int msg) {
return mDelegate != null ? mDelegate.showWaitDialog(msg) : null;
}
@Override
public Dialog showWaitDialog(String msg) {
return mDelegate != null ? mDelegate.showWaitDialog(msg) : null;
}
@Override
public Dialog showWaitDialog(@NonNull String msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback) {
return mDelegate != null ? mDelegate.showWaitDialog(msg, cancelable, callback) : null;
}
@Override
public Dialog showWaitDialog(@StringRes int msg, boolean cancelable, @Nullable DialogInterface.OnCancelListener callback) {
return mDelegate != null ? mDelegate.showWaitDialog(msg, cancelable, callback) : null;
}
@Override
public void dismissWaitDialog() {
if(mDelegate != null)
mDelegate.dismissWaitDialog();
}
}
UIConstant
定義Activity或Fragment通信時(shí)所用到的一些常量參數(shù)。
public class UIConstant {
String EXTRA_NAME = "extra_name";
String EXTRA_PHONE = "extra_phone";
}
UIHelper
包含一系列的輔助方法如在多人開發(fā)過程中你寫了一個(gè)Activity但是要啟動(dòng)這個(gè) Activity必需要帶一些參數(shù)由于是個(gè)人開發(fā)的別人也不清楚如何去調(diào)用這里推薦在UIHelper中聲明如何去啟動(dòng)這個(gè)Activity。
public class UIHelper {
public static void startInfoActivity(Context context,String phone){
Intent intent = new Intent(context, InfoActivity.class);
intent.putExtra(UIConstant.EXTRA_PHONE, phone);
intent.setPackage(context.getPackageName());
context.startActivity(intent);
}
public static boolean sdkCompare(int sdkInt){
return Build.VERSION.SDK_INT >= sdkInt;
}
public static boolean isDestroyed(Activity activity){
if(UIHelper.sdkCompare(Build.VERSION_CODES.JELLY_BEAN_MR1)){
return activity.isDestroyed();
}
return activity.isFinishing();
}
}
使用MVP
使用MVP開發(fā)模式隔離業(yè)務(wù)與模型減少View的代碼。讓View實(shí)現(xiàn)UIDelegate這樣Presenter具備顯示Toast、Dialog等功能。
public interface IView extends UIDelegate{
}
《架構(gòu)文摘》每天一篇架構(gòu)領(lǐng)域重磅好文,涉及一線互聯(lián)網(wǎng)公司應(yīng)用架構(gòu)(高可用、高性 能、高穩(wěn)定)、大數(shù)據(jù)、機(jī)器學(xué)習(xí)等各個(gè)熱門領(lǐng)域。
總結(jié)
以上是生活随笔為你收集整理的APP设计与开发(ui篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数织等逻辑游戏网站推荐
- 下一篇: 三星官宣新机:F54 5G将于6月6日发