2016-02-15 3 views
1

Итак, я начинаю писать приложения с помощью шаблонов проектирования. И я застрял между ними. Простите меня, если я совершу какую-нибудь глупую ошибку.Лучшая практика дизайна шаблона

Я начал с создания BaseActivity как,

BaseAppCompatActivity:

public abstract class BaseAppCompatActivity extends AppCompatActivity { 

    private ProgressDialog mProgressDialog; 
    private Toolbar mToolbar; 
    private TabLayout mTabLayout; 

    private boolean hasToolBar; 
    private boolean hasTabLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { 
     super.onCreate(savedInstanceState, persistentState); 
     setContentView(getLayoutResource()); 
     initiateViews(); 
     initToolBar(); 
     initTabLayout(); 
    } 

    public abstract int getLayoutResource(); 

    protected abstract void initiateViews(); 

    public void setHasToolBar(boolean hasToolBar){ 
     this.hasToolBar = hasToolBar; 
    } 

    public void initToolBar() { 
     if (hasToolBar){ 
      mToolbar = (Toolbar) findViewById(R.id.toolbar); 
      setSupportActionBar(mToolbar); 
     } 
    } 

    public Toolbar getToolBar(){ 
     return mToolbar; 
    } 

    public void setHasTabLayout(boolean hasTabLayout){ 
     this.hasTabLayout= hasTabLayout; 
    } 

    public void initTabLayout(){ 
     if (hasTabLayout){ 
      mTabLayout = (TabLayout)findViewById(R.id.tabLayout); 
     } 
    } 

    public void showProgressDialog() { 
     mProgressDialog = ProgressDialog.show(this, "Loading", "Please wait...", true, false); 
    } 

    public void hideProgressDialog() { 
     if (mProgressDialog != null && mProgressDialog.isShowing()) { 
      mProgressDialog.dismiss(); 
     } 
    } 

    public void showToast(String message) { 
     Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); 
    } 

    public void logInformation(Class tag, String description) { 
     Log.i(tag.getName(), description); 
    } 

    public void logError(Class tag, String description) { 
     Log.e(tag.getName(), description); 
    } 

    public void logDebug(Class tag, String description) { 
     Log.d(tag.getName(), description); 
    } 

    public void launchActivity(Class activity, Bundle bundle) { 
     Intent intent = new Intent(this, activity); 
     if (bundle != null) { 
      intent.putExtras(bundle); 
     } 
     startActivity(intent); 
    } 

    public void launchActivity(Class activity) { 
     launchActivity(activity, null); 
    } 

    public void loadFragment(){} 

    public String getStringResource(int key){ 
     return getResources().getString(key); 
    } 
} 

Теперь моя первая активность SplashActivity будет расширяться, что BaseAppCompatActivity и я закодировал, как показано ниже:

SplashActivity:

public class SplashActivity extends BaseAppCompatActivity { 

    private Context mContext = this; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
//  setContentView(R.layout.activity_splash); 

//  new Handler().postDelayed(new Runnable() { 
//   @Override 
//   public void run() { 
//    startActivity(new Intent(mContext, IntroductionActivity.class)); 
//   } 
//  }, 4000); 
    } 

    @Override 
    public int getLayoutResource() { 
     return R.layout.activity_splash; 
    } 

    @Override 
    protected void initiateViews() { 
     setHasToolBar(false); 
    } 
} 

Проблема в том, что я получаю белый экран, а не мой макет. Зачем ? Просьба предоставить ответ по надлежащей и подробной причине. Кроме того, как я могу улучшить свой текущий BaseAppCompatActivity еще больше?

Edit: Добавление манифеста по запросу:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.androidveteran.android.xxx"> 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <application 
     android:name=".baseclass.BaseApplication" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".activity.SplashActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".activity.IntroductionActivity" 
      android:label="@string/title_activity_introduction" 
      android:theme="@style/AppTheme.NoActionBar" /> 
     <activity 
      android:name=".activity.LoginActivity" 
      android:label="@string/title_activity_login" 
      android:parentActivityName=".activity.IntroductionActivity" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.androidveteran.android.restclient.activity.IntroductionActivity" /> 
     </activity> 

     <meta-data 
      android:name="AA_DB_NAME" 
      android:value="xxx.db" /> 
     <meta-data 
      android:name="AA_DB_VERSION" 
      android:value="1" /> 
     <meta-data 
      android:name="AA_MODELS" 
      android:value="com.androidveteran.android.xxx.database.model.User" /> 

     <activity 
      android:name=".activity.HomeActivity" 
      android:label="@string/title_activity_home" 
      android:theme="@style/AppTheme.NoActionBar" /> 
    </application> 

</manifest> 

activity_splash.xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context=".activity.SplashActivity"> 

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

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

content_splash.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:animateLayoutChanges="true" 
    android:background="@color/colorPrimary" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context=".activity.SplashActivity" 
    tools:showIn="@layout/activity_splash"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:orientation="vertical"> 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:adjustViewBounds="true" 
      android:src="@drawable/logo" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:layout_marginTop="@dimen/margin_32" 
      android:text="" 
      android:textColor="@android:color/white" 
      android:textSize="36sp" 
      android:textStyle="bold" /> 
    </LinearLayout> 

</RelativeLayout> 
+0

Просьба показать манифест андроида. –

+0

Пожалуйста, поделитесь activity_splash.xml, так как у вас есть макет экрана. –

+0

Мой манифест и макет кода в порядке, я уверен в этом. Я ошибаюсь в реализации собственной «BaseAppCompatActivity». –

ответ

2

Дело в том, в вашем SplashActivity вы звоните onCreate() методу

@Override 
public void onCreate(Bundle savedInstanceState) { 

однако в BaseAppCompatActivity вы используете onCreate() метод с другими параметрами

@Override 
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { 

Попробуйте использовать одни и те же параметры.

+0

Спасибо, это сработало .. !! –

0

Да. Используя метод прототип с одним аргументом был первый шаг, изменилось в BaseAppCompatActivity

@Override 
public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { 

} 

в

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 

} 

. Я также должен был изменить тип метода в onCreate() публике в SplashActivity:

@Override 
public void onCreate(Bundle savedInstanceState) { 

} 

Только тогда он работал. Итак, наконец-то мой код выглядит следующим образом:

BaseAppCompatActivity:

public abstract class BaseAppCompatActivity extends AppCompatActivity { 

    private ProgressDialog mProgressDialog; 
    private Toolbar mToolbar; 
    private TabLayout mTabLayout; 

    private boolean hasToolBar; 
    private boolean hasTabLayout; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(getLayoutResourceId()); 
    } 

    protected abstract int getLayoutResourceId(); 

    protected abstract void initiateViews(); 

    private void initDatabase() { 
     ActiveAndroid.initialize(this); 
    } 

    public void setHasToolBar(boolean hasToolBar){ 
     this.hasToolBar = hasToolBar; 
    } 

    public void initToolBar() { 
     if (hasToolBar){ 
      mToolbar = (Toolbar) findViewById(R.id.toolbar); 
      setSupportActionBar(mToolbar); 
     } 
    } 

    public Toolbar getToolBar(){ 
     return mToolbar; 
    } 

    public void setHasTabLayout(boolean hasTabLayout){ 
     this.hasTabLayout= hasTabLayout; 
    } 

    public void initTabLayout(){ 
     if (hasTabLayout){ 
      mTabLayout = (TabLayout)findViewById(R.id.tabLayout); 
     } 
    } 

    public void showProgressDialog() { 
     mProgressDialog = ProgressDialog.show(this, "Loading", "Please wait...", true, false); 
    } 

    public void hideProgressDialog() { 
     if (mProgressDialog != null && mProgressDialog.isShowing()) { 
      mProgressDialog.dismiss(); 
     } 
    } 

    public void showToast(String message) { 
     Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); 
    } 

    public void logInformation(Class tag, String description) { 
     Log.i(tag.getName(), description); 
    } 

    public void logError(Class tag, String description) { 
     Log.e(tag.getName(), description); 
    } 

    public void logDebug(Class tag, String description) { 
     Log.d(tag.getName(), description); 
    } 

    public void launchActivity(Class activity, Bundle bundle) { 
     Intent intent = new Intent(this, activity); 
     if (bundle != null) { 
      intent.putExtras(bundle); 
     } 
     startActivity(intent); 
    } 

    public void launchActivity(Class activity) { 
     launchActivity(activity, null); 
    } 

    public void loadFragment(){} 

    public String getStringResource(int key){ 
     return getResources().getString(key); 
    } 
} 

SplashActivity:

public class SplashActivity extends BaseAppCompatActivity { 

    private Context mContext = this; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
//  setContentView(R.layout.activity_splash); 

//  new Handler().postDelayed(new Runnable() { 
//   @Override 
//   public void run() { 
//    startActivity(new Intent(mContext, IntroductionActivity.class)); 
//   } 
//  }, 4000); 
    } 

    @Override 
    protected int getLayoutResourceId() { 
     return R.layout.activity_splash; 
    } 

    @Override 
    protected void initiateViews() { 
     setHasToolBar(false); 
    } 
} 
+0

Хорошо. Вы примете мой комментарий, если я переписал его в качестве ответа? –

+0

@VasilyKabunov Почему бы и нет. Добавьте свой ответ с некоторым объяснением, и я соглашусь. Не проблема :) –