在Android初次的前期學習中的十二個小例子(附案例下載)


目錄(點擊標題即可下載):
 
一、新建DemoActivity:
  1. 在res/layout/下新建activity_demo.xml
  2. 在manifests/文件夾下的AndroidManifest.xml注冊(可使用Alt+Enter快捷方式)
  3. 新建DemoActivity繼承Activity,並覆寫onCreate(),在里面添加setContentView指向資源文件夾下的DemoActivity
二、使用匿名類設置事件監聽     
  1. findViewById()找到View資源,設置監聽。調用View對象的一個方法setOnClickListener,該方法的參數為OnClickListener,但是該方法是一個接口,需要重寫方法onClick。
三、使用Intent跳轉不同的Activity
Intent intent = new Intent(MainActivity.this, DemoActivity.this);
startActivtiy(intent);
 

 
一、對Button注冊鼠標點擊事件
二、使用Intent實現點擊操作的事件:打開指定網頁、打開相機、打開電話頁面、設置無線網等等。
//打開百度網頁
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

Hello3:點擊監聽事件集中處理

一、通過findViewById()找到View資源,封裝成findView()函數
二、對View資源設置點擊監聽器setOnClickListener,封裝成setListener()函數
三、實現View.OnClickListener接口,並覆寫onClick()方法.
@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.helloWorld1:
            Log.i("textView1","helloWorld1");
            break;
        case R.id.helloWorld2:
            Log.i("textView2","helloWorld2");
            break;
     }
}

Hello4:登錄注冊界面布局

  使用RelativeLayout布局界面
 
一、使用RelativeLayout布局界面,將彩虹放在中央,android:layout_centerInParent="true"。
二、使用LinearLayout布局將View垂直放置,android:orientation="vertical"。
 

  使用RelativeLayout作為整體布局,分別用LinearLayout布局放置線性布局,用RelativeLayout布局放置相對布局。
 
  三類常用監聽事件:View.OnLongClickListener、View.OnClickListener、View.OnFocusChangeListener
一、封裝findViewById()找到對應的View資源
 
二、封裝setListener()注冊監聽事件:長按事件、點擊事件、焦點改變事件。
 
三、實現對應的監聽接口,關鍵詞implements
 
四、重寫onClick()方法、onLongClick()方法、onFocusChange()方法和afterTextChanged()方法。
 
五、添加消息提示:Toast.makeText(this,"長按按鈕-點擊",Toast.LENGTH_SHORT).show();
 
  1. 新建Activity視圖為activity_item.xml,進行頁面布局並添加ListView
  2. 新建Activity的子類顯示activity_item資源,並在manifests里面注冊
  3. 新建ListAdpter繼承BaseAdapter,並覆寫主要的方法:getCount()和getView()
  4. 在ListAdpter添加List<String>對象,這是ListView的視圖來源,在覆寫getView()的方法時,使用LayoutInflater的inflater()方法將activity_item填充並可以設置TextView的文本。
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    View view1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.activity_item,viewGroup,false);
    TextView textView = view1.findViewById(R.id.text);
    textView.setText(mData.get(i));
    return view1;
}

Hello9:UI線程與非UI線程之間的消息傳遞Handler

   線程安全機制:只有創建UI的線程能更改UI,並且UI線程不能進行耗時操作。
 
一、子線程進行耗時操作,操作完成后,使用Handler或Handler的子類的sendEmptyMessage()方法
 
private void download() {
    Runnable runnable = new Runnable() {
    @Override
    public void run() {
    try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        mHandler.sendEmptyMessage(1);
        }
    };
    Thread thread = new Thread(runnable);
    thread.start();
}
二、主線程完成Handler的對象建立,並覆寫回調函數handleMessage()方法操作UI
 
mHandler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
    if (msg.what == 1){
        mBtDownload.setText(R.string.downloaded);
        }
    }
};

Hello10:使用SharedPerferences保存用戶的“偏好設置”

一、獲取SharedPerferences和editor的對象並設置權限等級(私有權限:Context.MODE_PRIVATE)
sharedPreferences = getSharedPreferences("count", Context.MODE_PRIVATE);
editor = sharedPreferences.edit();

二、向空間中添加鍵值對:

editor.putInt("count",count);
editor.apply();
三、取出空間中持久化的鍵值對:
count = sharedPreferences.getInt("count",0);
優點:簡單易用。
缺點:效率比較低,不能存儲大量數據和復雜數據結構。
 
一、輸入輸出流都是相對於內存來說的
    1. 寫入文件,是從內存到文件,則是出去,即FileOutputStream
    2. 讀取文件,是從文件到內容,則是進來,即FileInputSteam
二、Android文件的四種操作模式
FileOutputStream = openFileOutput(name,mode) 應用程序的數據文件夾下的文件對應的輸入流
name為文件名,mode為Android文件的四種操作模式之一:
    1. Context.MODE_PRIVATE 默認操作模式,私有數據(只能應用本身訪問),寫入文件會被覆蓋
    2. Context.MODE_APPEND 檢驗文件是否存在,存在就追加內容,不存在就先新建文件再添加內容
    3. Context.WORLD_READABLE 可以被其他應用讀取
    4. Context.WORLD_WRITABLE 可以被其他應用寫入
    5. 既可讀又可寫:Context.WORLD_READABLE + Context.WORLD_WRITABLE
三、寫入文件
    1. 獲取內存寫入輸出流fileOutputSteam,使用openFileOutput(fileName,mode)
    2. 字符串轉換為字節數組,注意編碼格式,默認getBytes()編碼為UTF-8
    3. 寫入,使用fileOutputSteam.write(),注意捕獲異常
private void writeFile() {
    FileOutputStream fileOutputStream = null;
    try {
        fileName = mEtName.getText().toString();
        fileContext = mEtContent.getText().toString();
        fileOutputStream = openFileOutput(fileName, MODE_APPEND);     //1.獲取內存輸出流fileOutputSream
        fileOutputStream.write(fileContext.getBytes());               //2.字符串轉換為字節數組
        Toast.makeText(this,"寫入完成!",Toast.LENGTH_SHORT).show();
    } catch (java.io.IOException e) {
        e.printStackTrace();
        Toast.makeText(this,"捕獲IO異常!",Toast.LENGTH_SHORT).show();
    } finally {
        try {
        if (fileOutputStream!=null)
            fileOutputStream.close(); //無論捕獲異常還是正常執行,都需要關閉fileOutputStream
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
四、讀取文件
將文件讀取到內存中,使用輸入流FileInputStream
    1. 獲取內存輸入流:使用openFileInput()方法
    2. 獲得字節數組:定義字節數組用於暫時保存數據,使用fileInputStream.read(bytes)方法獲取,返回值為字節數組的大小size。
    3. 獲得字符串:使用new String(bytes)的方法將字節數組轉換為字符串,注意編碼格式,默認編碼格式為UTF-8。 在使用中需要用完整填充的字節數組,所以這里還需要新定義一個剛好為size的字節數組用於正確地轉換為字符串。
private void readFile() {
    FileInputStream fileInputStream = null;
    try {
        fileName = mEtName.getText().toString();
        fileInputStream = openFileInput(fileName); //1.獲取內存輸入流
        byte[] bytes = new byte[1024];
        int size = fileInputStream.read(bytes);          //2.讀入字節數組
        byte[] data = new byte[size];
        System.arraycopy(bytes,0,data,0,size);          //3.轉換為字符串,注意編碼格式
        String str = new String(data);
        textView.setText(str);
        Toast.makeText(this,"讀取完成!",Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this,"文件沒有找到!",Toast.LENGTH_SHORT).show();
    } finally {
        try {
            if (fileInputStream != null)
                fileInputStream.close();
        } catch (IOException e) {
                e.printStackTrace();
        }
    }
}

 

一、內部存儲(InternalStorage)與外部存儲(ExternalStorage)
    1. 內部存儲與外部存儲是相對於應用程序來說的,內部存儲是應用程序私有的,可設置對可外訪問。
    2. 內部存儲主要用於存儲應用的臨時數據,空間十分有限,應用卸載時,該目錄文件也被刪除。
二、內部存儲目錄:data/data/包名
內部存儲位置
存放數據類型
訪問方法
data/data/包名/shared_prefs 
SharedPreferences將數據持久化到xml文件存放的目錄
 
data/data/包名/databases  
數據庫文件存放的目錄
 
data/data/包名/files 
普通數據存放的目錄
context.getFilesDir()
data/data/包名/cache
緩存文件存放的目錄
context.getCacheDir()
 
三、mnt或storage外部存儲
1.判斷外部存儲是否可用 Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
外部存儲分類
外部存儲詳細目錄
使用方法
公共目錄
十大公共目錄
Environment.getExternalStorageDirectory().getPath()
私有目錄
storage/sbcard/Android/data/包名/files
getExternalFilesDir()
storage/sbcard/Android/data/包名/cache
getExternalCacheDir()
 
2.有包名的路徑都是調用Context中的方法獲取,沒有包名的路徑都是通過Environment中的方法獲取
 
四、補充
(1) 關於各種storage外部存儲的路徑:   
        其中sdcard/、mnt/sdcard、storage/sdcard0、storage/emulated/0、storage/emulated/legacy都是同一個路徑的不同“指針”,指向的是同一個地方,只是不同Android版本的叫法不一樣。如果大家想了解每個版本的外部存儲路徑,同學們可以通過獲取getExternalStorageDirectory方法的打印結果進行對比。
 
(2)清除緩存與清除數據
    1. 清除緩存:APP運行過程產生的臨時數據,為內部存儲文件。
    2. 清除數據:內部存儲/data/user/0/packname/和外部存儲/storage/emulated/0/Android/data/packname/下的文件里面的數據會全部刪除,包括cache,files,lib,shared_prefs等等。
(3)補充總結
    1. /data目錄下的文件物理上存放在我們通常所說的內部存儲里面 ,一般用於臨時數據,比如頭像,密鑰文件(隱私,空間有限)。
    2. /storage目錄下的文件物理上存放在我們通常所說的外部存儲里面 ,裁剪用於文件保存,上傳頭像(空間比較大)。
    3. /system用於存放系統文件,/cache用於存放一些緩存文件,物理上它們也是存放在內部存儲里面的
描述
代碼
  獲取內部存儲的根路徑
Environment.getDataDirectory() = /data  
  獲取外部存儲的根路徑
Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0 
  系統的內部存儲
Environment.getDownloadCacheDirectory() = /cache 
Environment.getRootDirectory() = /system 
(4)友情鏈接:
    1.  徹底了解android中的內部存儲與外部存儲  https://www.cnblogs.com/jingmo0319/p/5586559.html
    2. 徹底搞懂Android文件存儲---內部存儲,外部存儲以及各種存儲路徑解惑  https://blog.csdn.net/u010937230/article/details/73303034/ 
    3. Android存儲擴展學習-----應用的清除數據和清除緩存  https://blog.csdn.net/oudetu/article/details/78664514  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM