Android練手小項(xiàng)目(KTReader)基于mvp架構(gòu)(七)

上路傳送眼:
Android練手小項(xiàng)目(KTReader)基于mvp架構(gòu)(六)

Github地址: https://github.com/yiuhet/KTReader

上篇文章我們完成了項(xiàng)目的收藏和歷史功能元媚,
這篇我們將要完成該項(xiàng)目的最后的功能設(shè)置頁和關(guān)于頁。

先看看完成圖:

效果圖

我們想要在設(shè)置和關(guān)于界面完成的功能有:

  • 設(shè)置夜間模式
  • 主題色的選擇
  • 清空應(yīng)用緩存
  • 查看項(xiàng)目源碼
  • 分享好友應(yīng)用

所用到的知識點(diǎn)有:

  • PreferenceFragment
  • SharedPreferences
  • File的刪除
  • 代碼中設(shè)置theme
  • 剪切板

可完善和加強(qiáng)的內(nèi)容或功能有:

  • 檢查更新
  • 關(guān)于UI界面美化

ps:由于這里的功能并不復(fù)雜的止,所以我就沒有按照mvp的架構(gòu)來寫具垫,直接把業(yè)務(wù)邏輯寫在了view層猬仁。(偷懶一波,畢竟期末事情太多浅妆,復(fù)習(xí)考試鸥诽,課程設(shè)計(jì),還有找實(shí)習(xí)工作/(ㄒoㄒ)/~~)

1. 設(shè)置界面

如果我們自己寫設(shè)置的界面疹娶,還要保存相關(guān)的設(shè)置,雖然也不是很復(fù)雜伦连,但是官方提供了更好的類:PreferenceFragment雨饺。
我們寫個(gè)fragment繼承自PreferenceFragment然后在xml文件中寫布局就好了,系統(tǒng)會(huì)自動(dòng)幫我們保存里面的偏好設(shè)置(通過SharedPreferences)惑淳。
下面簡述一下Preference的知識點(diǎn)(之后我會(huì)寫一篇詳解额港。):

XML

  • PreferenceScreen
    根節(jié)點(diǎn),若一個(gè)xml文件中有嵌套的PreferenceScreen歧焦,點(diǎn)擊后將通過另一屏來顯示它包含的內(nèi)容移斩。

  • PreferenceCategory
    用來分組的東西,可以讓布局更有層次感绢馍。
    組件的通用屬性有

  • android:key 唯一標(biāo)識id

  • android:defaultValue 默認(rèn)值

  • android:title 主標(biāo)題

  • android:summary 副標(biāo)題
    用到的基本組件

  • ListPreference
    基本組件之一向瓷,點(diǎn)擊彈出列表對話框。

  • android:dialogTitle
    對話框標(biāo)題

  • android:entries
    列表顯示的文本()

  • android:entryValues
    實(shí)際系統(tǒng)保存的值舰涌,和entries一一對應(yīng)

  • SwitchPreference
    基本組件之一猖任,有on,off兩種狀態(tài)瓷耙。

  • Preference

PreferenceFragment

我們可以通過相關(guān)的監(jiān)聽接口來寫對其需要的功能:

  • onPreferenceClick(Preference preference)
    點(diǎn)擊事件發(fā)生朱躺,回調(diào)該方法
  • onPreferenceChange(Preference preference, Object newValue)
    值改變刁赖,回調(diào)該方法

我們可以通過以下方式在其他activity中得到Preference保存的值:

SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
mPrefs.getString(key, defaultValue);

OK,知道了這些,要寫一個(gè)設(shè)置界面就很簡單了长搀。
1.要先在res文件下建個(gè)xml文件夾(如果沒有)宇弛,寫xml文件。
2.建立SettingsFragment繼承自PreferenceFragment源请,
3.在回調(diào)方法里寫具體操作枪芒。
4.創(chuàng)建單例,里面實(shí)現(xiàn)獲取Preference的保存值巢钓。
res.xml.preferences:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:title="設(shè)置">

<PreferenceCategory
android:title="基本設(shè)置">
<SwitchPreference
android:title="夜間模式"
android:summary="夜間保護(hù)你的眼睛"
android:key="settings_safe"/>
<ListPreference
android:title="主題色"
android:key="settings_theme"
android:entries="@array/theme_entities"
android:entryValues="@array/theme_values"
android:defaultValue="@string/default_theme"
/>
<Preference
android:title="清空緩存"
android:key="settings_cache" />
</PreferenceCategory>

<PreferenceCategory
android:title="其他設(shè)置">
<Preference
android:title="檢查更新"
android:summary="當(dāng)前版本: 1.0"
android:key="settings_check"/>
<Preference
android:title="查看源碼"
android:summary="給開發(fā)者github上點(diǎn)個(gè)Star"
android:key="settings_look"/>
</PreferenceCategory>
</PreferenceScreen>

數(shù)組文件為:

<resources>
<string-array name="theme_entities">
<item>楞頭青</item>
<item>少女粉</item>
<item>畫韓紅</item>
<item>原諒綠</item>
<item>基佬紫</item>
</string-array>
<string-array name="theme_values">
<item>indigo</item>
<item>pink</item>
<item>red</item>
<item>green</item>
<item>purple</item>
</string-array>

<string name="default_theme">indigo</string>
<string name="default_lr">right</string>
</resources>

出來的效果是這樣的:

image.png

嗯 還不錯(cuò)病苗。

SettingsFragment

下面開始寫具體業(yè)務(wù)邏輯:
官方推薦的是使用fragment繼承自PreferenceFragment而不是繼承PreferenceActivity的activity來呈現(xiàn)界面和處理業(yè)務(wù)。所以我們跟著官方走使用PreferenceFragment症汹。我們要在onCreate中添加這樣一句話來加載xml文件:

addPreferencesFromResource(R.xml.preferences);

然后我們要初始化一些數(shù)據(jù)硫朦,寫個(gè)初始化方法:

private void initPer() {
        mOptionBlack = (SwitchPreference) findPreference("settings_safe");
        mOptionTheme = (ListPreference) findPreference("settings_theme");
        mOptionCache = findPreference("settings_cache");
        mOptionCheck = findPreference("settings_check");
        mOptionLook = findPreference("settings_look");

        mOptionBlack.setOnPreferenceChangeListener(this);
        mOptionTheme.setOnPreferenceChangeListener(this);
        mOptionCache.setOnPreferenceClickListener(this);
        mOptionCheck.setOnPreferenceClickListener(this);
        mOptionLook.setOnPreferenceClickListener(this);


        mOptionTheme.setSummary(String.format("當(dāng)前主題: %s",
                mOptionTheme.getEntry() == null ? "愣頭青" : mOptionTheme.getEntry()));

        mOptionCache.setSummary(FileSizeUtil.getAutoFileOrFilesSize(MyApplication.getAppCacheDir() + "/KTReaderCache"));
    }

在這個(gè)方法里,我們創(chuàng)建了對應(yīng)xml文件中的控件對象背镇,通過設(shè)置的key咬展。
然后給它們設(shè)置了監(jiān)聽器。并對副標(biāo)題動(dòng)態(tài)顯示瞒斩。

下面就是在回調(diào)里寫對它們的監(jiān)聽處理:
首先是當(dāng)主題設(shè)置被改變時(shí)破婆,我們要更改副標(biāo)題,并且彈出提示框胸囱,提示用戶重啟以使設(shè)置生效祷舀。

@Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (preference == mOptionTheme) {
           // mOptionTheme.setSummary("當(dāng)前主題: " + mOptionTheme.getEntry());
            if (newValue.equals("indigo")) {
                mOptionTheme.setSummary("當(dāng)前主題: 愣頭青");
            } else if (newValue.equals("pink")) {
                mOptionTheme.setSummary("當(dāng)前主題: 少女粉");
            }else if (newValue.equals("red")) {
                mOptionTheme.setSummary("當(dāng)前主題: 畫韓紅");
            }else if (newValue.equals("green")) {
                mOptionTheme.setSummary("當(dāng)前主題: 原諒綠");
            }else if (newValue.equals("purple")) {
                mOptionTheme.setSummary("當(dāng)前主題: 基佬紫");
            }
        }
        Snackbar.make(getView(),"主題切換成" +
                "功,重啟應(yīng)用后生效",Snackbar.LENGTH_INDEFINITE)
                .setAction("重啟", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(getActivity(), MainActivity.class);
                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        getActivity().startActivity(intent);
                        getActivity().finish();
                    }
                })
                .show();
        return true;
    }

之后我們對清除緩存的監(jiān)聽處理為彈出對話框再次詢問是否清除,防止誤操作烹笔,然后當(dāng)用戶選擇清除時(shí)裳扯,刪除緩存文件。對查看源碼處理為跳轉(zhuǎn)到項(xiàng)目github網(wǎng)址:

@Override
    public boolean onPreferenceClick(Preference preference) {
        if (preference == mOptionCache) {
            new AlertDialog.Builder(getActivity())
                    .setTitle("提示")
                    .setMessage("是否清除緩存?")
                    .setPositiveButton("清除", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            clearCache();
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    })
                    .show();
        } else if (preference == mOptionCheck) {
            Snackbar.make(getView(), "已是最新版本", Snackbar.LENGTH_SHORT).show();
        } else if (preference == mOptionLook) {
            goToHtml("https://github.com/yiuhet/KTReader");
        }
        return true;
    }

完整的SettingsFragment代碼如下
ui.fragment.SettingsFragment

public class SettingsFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener, Preference.OnPreferenceClickListener {

    SwitchPreference mOptionBlack ;
    ListPreference mOptionTheme;
    Preference mOptionCache;
    Preference mOptionCheck;
    Preference mOptionLook;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initPer();
    }

    private void initPer() {
        mOptionBlack = (SwitchPreference) findPreference("settings_safe");
        mOptionTheme = (ListPreference) findPreference("settings_theme");
        mOptionCache = findPreference("settings_cache");
        mOptionCheck = findPreference("settings_check");
        mOptionLook = findPreference("settings_look");

        mOptionBlack.setOnPreferenceChangeListener(this);
        mOptionTheme.setOnPreferenceChangeListener(this);
        mOptionCache.setOnPreferenceClickListener(this);
        mOptionCheck.setOnPreferenceClickListener(this);
        mOptionLook.setOnPreferenceClickListener(this);


        mOptionTheme.setSummary(String.format("當(dāng)前主題: %s",
                mOptionTheme.getEntry() == null ? "愣頭青" : mOptionTheme.getEntry()));

        mOptionCache.setSummary(FileSizeUtil.getAutoFileOrFilesSize(MyApplication.getAppCacheDir() + "/KTReaderCache"));
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (preference == mOptionTheme) {
           // mOptionTheme.setSummary("當(dāng)前主題: " + mOptionTheme.getEntry());
            if (newValue.equals("indigo")) {
                mOptionTheme.setSummary("當(dāng)前主題: 愣頭青");
            } else if (newValue.equals("pink")) {
                mOptionTheme.setSummary("當(dāng)前主題: 少女粉");
            }else if (newValue.equals("red")) {
                mOptionTheme.setSummary("當(dāng)前主題: 畫韓紅");
            }else if (newValue.equals("green")) {
                mOptionTheme.setSummary("當(dāng)前主題: 原諒綠");
            }else if (newValue.equals("purple")) {
                mOptionTheme.setSummary("當(dāng)前主題: 基佬紫");
            }
        }
        Snackbar.make(getView(),"主題切換成" +
                "功,重啟應(yīng)用后生效",Snackbar.LENGTH_INDEFINITE)
                .setAction("重啟", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(getActivity(), MainActivity.class);
                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        getActivity().startActivity(intent);
                        getActivity().finish();
                    }
                })
                .show();
        return true;
    }

    @Override
    public boolean onPreferenceClick(Preference preference) {
        if (preference == mOptionCache) {
            new AlertDialog.Builder(getActivity())
                    .setTitle("提示")
                    .setMessage("是否清除緩存?")
                    .setPositiveButton("清除", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            clearCache();
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    })
                    .show();
        } else if (preference == mOptionCheck) {
            Snackbar.make(getView(), "已是最新版本", Snackbar.LENGTH_SHORT).show();
        } else if (preference == mOptionLook) {
            goToHtml("https://github.com/yiuhet/KTReader");
        }
        return true;
    }

    private void goToHtml(String url) {
        Uri uri = Uri.parse(url);   //指定網(wǎng)址
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);           //指定Action
        intent.setData(uri);                            //設(shè)置Uri
        startActivity(intent);        //啟動(dòng)Activity
    }

    public void clearCache() {
        Observable.just(deleteFile(new File(MyApplication.getAppCacheDir() + "/KTReaderCache")))
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(AndroidSchedulers.mainThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept(@NonNull Boolean aBoolean) throws Exception {
                        mOptionCache.setSummary(FileSizeUtil.getAutoFileOrFilesSize(MyApplication.getAppCacheDir() + "/KTReaderCache"));
                        Snackbar.make(getView(), "緩存已清除", Snackbar.LENGTH_SHORT).show();
                    }
                });
    }

    public boolean deleteFile(File file) {
        if (file.isFile()) {
            return file.delete();
        }

        if (file.isDirectory()) {
            File[] childFiles = file.listFiles();
            if (childFiles == null || childFiles.length == 0) {
                return file.delete();
            }

            for (File childFile : childFiles) {
                deleteFile(childFile);
            }
            return file.delete();
        }
        return false;
    }
}

這樣,我們的設(shè)置頁就大功告成了。

2.關(guān)于界面

之后的關(guān)于頁就沒啥東西了嚣鄙,只是簡單的鋪個(gè)界面,加幾個(gè)控件冤吨,其中相應(yīng)的操作有:

  • 打開源碼地址,上面有講饶套;
  • 把我的聯(lián)系方式復(fù)制到粘貼版漩蟆;
  • 分享應(yīng)用給好友。

復(fù)制功能

ClipboardManager manager = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("msg", "965846580");
manager.setPrimaryClip(clipData);
Snackbar.make(view,"我的qq號已經(jīng)復(fù)制到剪切板啦( ?? .? ?? )?",Snackbar.LENGTH_SHORT).show();

分享功能

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(Intent.EXTRA_SUBJECT, "分享app");
sharingIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_txt));//string為感謝使用“KTReader”妓蛮,您可以在https://github.com/yiuhet/KTReader查看源碼或下載爆安;
startActivity(Intent.createChooser(sharingIntent, getString(R.string.share_app)));//string為分享-KTReader;

完整代碼
ui.activity.AboutActivity


public class AboutActivity extends BaseActivity {

    @BindView(R.id.toolbar)
    Toolbar mToolbar;
    @BindView(R.id.button_github)
    Button mButtonGithub;
    @BindView(R.id.button_jianshu)
    Button mButtonJianshu;
    @BindView(R.id.button_share)
    Button mButtonShare;
    @BindView(R.id.button_tucao)
    Button mButtonTucao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ButterKnife.bind(this);
        mToolbar.setTitle("關(guān)于");
        setSupportActionBar(mToolbar);
    }

    @Override
    protected int getLayoutRes() {
        return R.layout.activity_about;
    }

    @OnClick({R.id.button_github, R.id.button_jianshu, R.id.button_share, R.id.button_tucao})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.button_github:
                goToHtml("https://github.com/yiuhet/KTReader");
                break;
            case R.id.button_jianshu:
                goToHtml("http://www.reibang.com/u/8857dea54ec2");
                break;
            case R.id.button_share:
                Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                sharingIntent.setType("text/plain");
                sharingIntent.putExtra(Intent.EXTRA_SUBJECT, "分享app");
                sharingIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_txt));
                startActivity(Intent.createChooser(sharingIntent, getString(R.string.share_app)));
                break;
            case R.id.button_tucao:
                ClipboardManager manager = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE);
                ClipData clipData = ClipData.newPlainText("msg", "965846580");
                manager.setPrimaryClip(clipData);
                Snackbar.make(view,"我的qq號已經(jīng)復(fù)制到粘貼板啦( ?? .? ?? )?",Snackbar.LENGTH_SHORT).show();
                break;
        }
    }

    private void goToHtml(String url) {
        Uri uri = Uri.parse(url);   //指定網(wǎng)址
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);           //指定Action
        intent.setData(uri);                            //設(shè)置Uri
        startActivity(intent);        //啟動(dòng)Activity
    }

}

3.結(jié)語

KTReader(Kill Time Reader)這個(gè)小項(xiàng)目,開發(fā)周期近30天,算是初學(xué)Android的我做的第一個(gè)有著完整結(jié)構(gòu)的應(yīng)用扔仓,它的功能并不完善褐奥,也仍有一些bug存在,可為了完善它翘簇,我仍費(fèi)了好大一番功夫撬码,有過完成一個(gè)小功能而沾沾自喜,也有過被bug折磨的焦頭爛額版保。
總之在今天我完成了它呜笑,在開發(fā)期間我也學(xué)到了很多東西,感謝開源精神讓我成長并瞻仰大佬們的代碼彻犁,感謝各位大牛的干貨分享叫胁,讓我能降低學(xué)習(xí)成本快速學(xué)習(xí)。
我把這款應(yīng)用的開發(fā)過程寫下來并分享汞幢,一是為了記錄以便今后使用驼鹅,二是希望能夠結(jié)識到更多的朋友,當(dāng)然如果能夠幫到你的話森篷,就更加美好了输钩,為了方便大家閱讀,我之后會(huì)寫一個(gè)總結(jié)篇仲智。
KTReader這款應(yīng)用买乃,萬一有幸被屏幕前的你所發(fā)現(xiàn),這是我的幸運(yùn)钓辆,如果你能點(diǎn)個(gè)心剪验,更是對我莫大的鼓勵(lì)。如果你是大神前联,請幫我指正我的不足之處功戚;如果你和我一樣是初學(xué)者,歡迎和我一塊學(xué)習(xí)討論蛀恩。這里留下我的聯(lián)系qq:965846580,加好友請備注Android茂浮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末双谆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子席揽,更是在濱河造成了極大的恐慌顽馋,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幌羞,死亡現(xiàn)場離奇詭異寸谜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)属桦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門熊痴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來他爸,“玉大人,你說我怎么就攤上這事果善≌矬裕” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵巾陕,是天一觀的道長讨跟。 經(jīng)常有香客問我,道長鄙煤,這世上最難降的妖魔是什么晾匠? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮梯刚,結(jié)果婚禮上凉馆,老公的妹妹穿的比我還像新娘。我一直安慰自己乾巧,他們只是感情好句喜,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沟于,像睡著了一般咳胃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旷太,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天展懈,我揣著相機(jī)與錄音,去河邊找鬼供璧。 笑死存崖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的睡毒。 我是一名探鬼主播来惧,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼演顾!你這毒婦竟也來了供搀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钠至,失蹤者是張志新(化名)和其女友劉穎葛虐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棉钧,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屿脐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片的诵。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡万栅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奢驯,到底是詐尸還是另有隱情申钩,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布瘪阁,位于F島的核電站撒遣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏管跺。R本人自食惡果不足惜义黎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豁跑。 院中可真熱鬧廉涕,春花似錦、人聲如沸艇拍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卸夕。三九已至层释,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間快集,已是汗流浹背贡羔。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留个初,地道東北人乖寒。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像院溺,于是被迫代替她去往敵國和親楣嘁。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,303評論 25 707
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程珍逸,因...
    小菜c閱讀 6,444評論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理逐虚,服務(wù)發(fā)現(xiàn),斷路器弄息,智...
    卡卡羅2017閱讀 134,704評論 18 139
  • 2017年摹量,致太多不完美的我 16年的上半年,我還是個(gè)大一的糊涂小學(xué)妹,而如今缨称,在這17年的開始凝果,我早已習(xí)慣了學(xué)...
    愛讀書的喵123閱讀 268評論 0 0
  • 一部《人民的名義》火了《萬歷十五年》器净,也火了國家機(jī)構(gòu)相互碾壓的顛覆視覺感。話說回來当凡,一介人民山害,離那些權(quán)利斗爭太遙遠(yuǎn)...
    羅小宸閱讀 277評論 0 3