GeoQuiz項目總結


  • 用戶界面設計
  • Android 與MVC模式
  • Activity生命周期
  • 第二個Activity
  • 心得體會

用戶界面設計

用戶界面是由組件構造而成的琼掠,它可以顯示文字或圖像混移,與用戶交互救拉,甚至布置屏幕上的其他組件氏堤。默認的activity布局是由RelativeLayoutTextView兩個組件構成档插。且一個activity只能有一個LinearLayout根元素慢蜓,作為根元素,必須指定Android XML的資源文件的命名空間(namespace)屬性郭膛。


Android 與MVC模式

Android 應用是基于MVC模式開發(fā)的晨抡,模型——視圖——控制器的架構模式。

模型對象:存儲應用的數(shù)據和業(yè)務邏輯
視圖對象:用戶界面则剃,由各類組件構成
控制器對象:包含應用的邏輯單元耘柱,響應視圖對象觸發(fā)的事件,管理視圖對象和模型對象之間的數(shù)據流動棍现。(Activity调煎、Fragment、Service)

更新視圖層

增加一個Next按鈕

<Button
        android:id="@+id/next_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawablePadding="4dp"
        android:text="@string/next_button" />

更新字符串資源

<string name="next_button">Next</string>

新增問題字符串

    <string name="question_australia">Canberra is the capital of Ausrtalia .</string>
    <string name="question_oceans">The Pacific Ocean is larger than the Atlanic Ocean</string>
    <string name="question_mideast">The Suez Canal connects the Red Sea and the Indian Ocean</string>
    <string name="question_africa">The source of the Nile River is in Egypt.</string>
    <string name="question_americas">The Amazon River is the longer river in the Americas.</string>
    <string name="question_asia">Lake Baikal is the world\'s oldest and deepest freshwater lake.</string>

更新控制器層

增加按鈕變量及Question對象數(shù)組

private TextView mQuestionTextView;

private Question[] mQuestionBank = new Question[] {
      new Question(R.string.question_australia,true),
            new Question(R.string.question_oceans,true),
            new Question(R.string.question_mideast,true),
            new Question(R.string.question_africa,true),
            new Question(R.string.question_americas,true),
            new Question(R.string.question_asia,true)
    };

使用UpdateQuestion()封裝公共代碼

mNextButton =(Button)findViewById(R.id.next_button);
        mNextButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                mCurrentIndex =(mCurrentIndex + 1)%mQuestionBank.length;
                mIsCheater = false;
                //int question = mQuestionBank[mCurrentIndex].getmTextResId();
                //mQuestionTextView.setText(question);
                updateQuestion();
            }
        });

        mCheatButton = (Button) findViewById(R.id.cheat_button);
        mCheatButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Start CheatActicity
                //Intent intent=new Intent(QuizActivity.this,CheatActivity.class);
                boolean answerIsTrue = mQuestionBank[mCurrentIndex].ismAnswerTrue();
                Intent intent = CheatActivity.newIntent(QuizActivity.this,answerIsTrue);
                //startActivity(intent);
                startActivityForResult(intent,REQUEST_CODE_CHEAT);
            }
        });
        updateQuestion();
    }
    
    
     private void updateQuestion() {
        Log.d(TAG,"updating question",new Exception());
        int question = mQuestionBank[mCurrentIndex].getmTextResId();
        mQuestionTextView.setText(question);
    }

增加checkAnswer()方法——判斷用戶答案的正確性轴咱,修正之前代碼的邏輯性錯誤(認為所有答案都是true)

 private void checkAnswer(boolean userPressedTrue) {
        boolean answerIsTrue = mQuestionBank[mCurrentIndex].ismAnswerTrue();
        int messageResId = 0;
        if (mIsCheater) {
            messageResId = R.string.judgment_toast;
        }else {
            if (userPressedTrue == answerIsTrue) {
                messageResId = R.string.correct_toast;
            }else {
                messageResId = R.string.incorrect_toast;
            }
        }


        Toast.makeText(this,messageResId,Toast.LENGTH_SHORT).show();
    }

調用checkAnswer()方法汛蝙,在按鈕的監(jiān)聽器里

mTrueButton = (Button) findViewById(R.id.true_button);
        mTrueButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast.makeText(QuizActivity.this,
                       // R.string.correct_toast,
                        //Toast.LENGTH_SHORT).show();
                //Dose nothing yet,but soon!
                checkAnswer(true);

            }
        });
        mFalseButton = (Button) findViewById(R.id.false_button);
        mFalseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               // Toast.makeText(QuizActivity.this,
                 //       R.string.incorrect_toast,
                   //     Toast.LENGTH_SHORT).show();
                //Does nothing yet, but soon!
                checkAnswer(false);
            }
        });

Acticity的生命周期

activity的狀態(tài):不存在烈涮、停止、暫停窖剑、運行

用戶可以與當前運行狀態(tài)下的activity交互坚洽。但是任何時候只有一個activity能與用戶進行交互。

activty的生命周期回調函數(shù):onCreate()西土、onDestory()讶舰、onStart()onStop()需了、onResume()跳昼、onPause().

通過這幾種方法可以在activity的生命周期狀態(tài)發(fā)生關鍵性轉換時完成某些工作。

日志跟蹤理解activity生命周期

由于覆蓋方法會輸出日志肋乍,我們可以通過覆蓋activity生命周期方法來了解activity的狀態(tài)變化情況鹅颊。

輸出日志信息

新增一個日志常量

private static final String TAG = "QuizActivity";

onCreate(Bundle)方法添加日志輸出代碼

...
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        **Log.d(TAG,"onCreate(Bundle) calles");**
        setContentView(R.layout.activity_quiz);
...

覆蓋更多生命周期方法

...
@Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"onStart() called");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"onResume() called");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG,"onPause() called");
    }
    
     @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG,"onStop() called");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestory() called");
    }
    ...

創(chuàng)建水平模式布局

1.右鍵單擊res目錄后選擇New->Android resources directory ,選擇layout資源類型
2.將待選資源特征列表中的Orientation單擊>>按鈕將其移動到已選資源特征區(qū)域中墓造。
3.選中Screen orentation中的Landsacpe選項堪伍,目錄名為layout-land

  • Android 視圖下的看不到res/layout-land目錄觅闽,需要切換到Project視圖下帝雇。

第二個Activity

一個activity控制一屏信息,新activity是用來方便用戶偷看答案的

  • 啟動activity:基于intent的通信——intent對象是compoment用來與操作系統(tǒng)通信的一種媒介工具
  • activity的數(shù)據傳遞:使用intent extra ,從子activity獲取返回結果

具體代碼如下:
QuizActivity.java

    private static final String KEY_INDEX = "index";
    private static final int REQUEST_CODE_CHEAT = 0;
    
    ...
    mCheatButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Start CheatActicity
                //Intent intent=new Intent(QuizActivity.this,CheatActivity.class);
                boolean answerIsTrue = mQuestionBank[mCurrentIndex].ismAnswerTrue();
                Intent intent = CheatActivity.newIntent(QuizActivity.this,answerIsTrue);
                //startActivity(intent);
                startActivityForResult(intent,REQUEST_CODE_CHEAT);
            }
        });
        
        @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != Activity.RESULT_OK) {
            return;
        }
        if (requestCode == REQUEST_CODE_CHEAT) {
            if (data == null) {
                return ;
            }
            mIsCheater = CheatActivity.wasAnswerShown(data);
        }
    }
    ...

CheatActivity.java

private static final String EXTRA_ANSWER_IS_TRUE ="cn.happy.qxy.geoquiz.answer_is_true";
private boolean mAnswerIsTrue;

 public static Intent newIntent(Context packageContext,boolean answerIsTrue) {
        Intent intent = new Intent(packageContext,CheatActivity.class);
        intent.putExtra(EXTRA_ANSWER_IS_TRUE,answerIsTrue);
        return intent;
    }

 public static boolean wasAnswerShown(Intent result) {
        return result.getBooleanExtra(EXTRA_ANSWER_IS_TRUE,false);
    }

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

        mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE,false);
        mAnswerTexView = (TextView) findViewById(R.id.answer_text_view);

        mShowAnswerButton = (Button) findViewById(R.id.show_answer_button);
        mShowAnswerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mAnswerIsTrue) {
                    mAnswerTexView.setText(R.string.true_button);
                }else {
                    mAnswerTexView.setText(R.string.false_button);
                }
                setAnswerShownResult(true);
            }
        });
    }
    private void setAnswerShownResult(boolean isAnswerShown) {
        Intent data = new Intent();
        data.putExtra(EXTRA_ANSWER_IS_TRUE,isAnswerShown);
        setResult(RESULT_OK,data);
    }

心得體會

以上就是本次項目一些重要的步驟蛉拙,及詳細的代碼展示尸闸。麻雀雖小,組臟俱全孕锄。
了解到Android Studio 的獨有的優(yōu)勢:

  • 速度優(yōu)于Eclipse
  • 提示補全更加人性化
  • 支持Google Cloud Platform
  • 強大的UI編輯器
  • 受歡迎的第三方GenyMoton虛擬機
  • Android Studio特有的異常調試工具Android Lint
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末吮廉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子畸肆,更是在濱河造成了極大的恐慌茧痕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恼除,死亡現(xiàn)場離奇詭異,居然都是意外死亡曼氛,警方通過查閱死者的電腦和手機豁辉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舀患,“玉大人徽级,你說我怎么就攤上這事×那常” “怎么了餐抢?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵现使,是天一觀的道長。 經常有香客問我旷痕,道長碳锈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任欺抗,我火速辦了婚禮售碳,結果婚禮上,老公的妹妹穿的比我還像新娘绞呈。我一直安慰自己贸人,他們只是感情好,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布佃声。 她就那樣靜靜地躺著艺智,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圾亏。 梳的紋絲不亂的頭發(fā)上十拣,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音召嘶,去河邊找鬼父晶。 笑死,一個胖子當著我的面吹牛弄跌,可吹牛的內容都是我干的甲喝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铛只,長吁一口氣:“原來是場噩夢啊……” “哼埠胖!你這毒婦竟也來了?” 一聲冷哼從身側響起淳玩,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤直撤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蜕着,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谋竖,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年承匣,在試婚紗的時候發(fā)現(xiàn)自己被綠了蓖乘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡韧骗,死狀恐怖嘉抒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情袍暴,我是刑警寧澤些侍,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布隶症,位于F島的核電站,受9級特大地震影響岗宣,放射性物質發(fā)生泄漏蚂会。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一狈定、第九天 我趴在偏房一處隱蔽的房頂上張望颂龙。 院中可真熱鬧,春花似錦纽什、人聲如沸措嵌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽企巢。三九已至,卻和暖如春让蕾,著一層夾襖步出監(jiān)牢的瞬間浪规,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工探孝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笋婿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓顿颅,卻偏偏與公主長得像缸濒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粱腻,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,145評論 25 707
  • 1.什么是Activity?問的不太多绍些,說點有深度的 四大組件之一,一般的,一個用戶交互界面對應一個activit...
    JoonyLee閱讀 5,734評論 2 51
  • 這個時代捞慌,選擇太多,變化太快柬批,每一次站在分岔路口啸澡,都是一次大考驗,糾結氮帐,郁悶锻霎,迷茫,都會無端地浪費大把光陰揪漩,而得不...
    丁少小蕾Melody閱讀 929評論 0 7
  • 前兩天聽同學提起這部電影,是吳天明導演的電影吏口,不過票房慘敗奄容,美團貓眼上的評分都很低冰更,不過還是想去欣賞一下,就像去欣...
    樂君陶陶閱讀 1,308評論 0 1
  • 有些感情像爛了的水果 水果水分多昂勒,營養(yǎng)豐富蜀细。 正如我們認識的六年里,我吃過剝好皮的橙子覺得甜戈盈,我吃過削下來的蘋果皮...
    湯芍兒閱讀 192評論 0 0