前提
熟悉java語言的基礎知識,了解常見的設計模式
安卓基礎知識
建議看這個文檔的第一章就夠了,google出的安卓教程,了解activity、fragment和布局文件。
官方文檔翻譯
源碼學習階段
界面UI
建議直接學習QMUI_Android的源碼的demo
QMUI_Android
直接在android studio里學習打開項目,找到AndroidManifest.xml這個文件,這個文件是整個項目的入口,里面定義了那個Activity是起始頁面。關鍵代碼如下:
<application
android:name=".QDApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/AppTheme"
tools:ignore="AllowBackup,GoogleAppIndexingWarning"
tools:targetApi="n">
<activity
android:name=".QDMainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize"/>
<activity
android:name=".activity.LauncherActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
QDApplication 集成了Android的基礎類android.app.Application類, 定義了Application的入口,也是QMUI初始化的地方
這個demo的入口是LauncherActivity,但是這個activity啟動后就直接跳到QDMainActivity,所以開始先忽略它,直接看QDMainActivity
@FirstFragments(
value = {
HomeFragment.class,
QDArchTestFragment.class,
QDArchSurfaceTestFragment.class,
QDNotchHelperFragment.class,
QDWebExplorerFragment.class,
QDContinuousNestedScroll1Fragment.class
})
@DefaultFirstFragment(HomeFragment.class)
@LatestVisitRecord
public class QDMainActivity extends BaseFragmentActivity {
@Override
protected int getContextViewId() {
return R.id.qmuidemo;
}
public static Intent createWebExplorerIntent(Context context, String url, String title) {
Bundle bundle = new Bundle();
bundle.putString(EXTRA_URL, url);
bundle.putString(EXTRA_TITLE, title);
return of(context, QDWebExplorerFragment.class, bundle);
}
public static Intent of(@NonNull Context context,
@NonNull Class<? extends QMUIFragment> firstFragment) {
return QMUIFragmentActivity.intentOf(context, QDMainActivity.class, firstFragment);
}
public static Intent of(@NonNull Context context,
@NonNull Class<? extends QMUIFragment> firstFragment,
@Nullable Bundle fragmentArgs) {
return QMUIFragmentActivity.intentOf(context, QDMainActivity.class, firstFragment, fragmentArgs);
}
}
這樣一看很難懂,其實關鍵就是上面那行注解,我找到了不用注解的版本,更容易理解
ublic class MainActivity extends QMUIFragmentActivity {
@Override
protected int getContextViewId() {
return R.id.demo;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
BaseFragment fragment = new HomeFragment();
getSupportFragmentManager()
.beginTransaction()
.add(getContextViewId(), fragment, fragment.getClass().getSimpleName())
.addToBackStack(fragment.getClass().getSimpleName())
.commit();
}
}
}
這樣就清晰多了,這個activity其實也沒干啥,就是把HomeFragment加載了進來,HomeFragmen就是你允許demo的主界面了。未完待續