PreferenceActivity In Android

Ứng dụng Android thường cần những settings để cho phép người dùng sửa đổi những thiết lập theo sở thích của họ. Android đã cung cấp một thành phần tuyệt vời để quản lý và lưu trữ những thiết lập đó. Nó cho phép chúng ta định nghĩa và tự động nó sẽ tạo ra giao điện UI để người dùng thiết lập . Tất cả những gì chúng ta cần làm là sử dụng nó trong ứng dụng của chúng ta. Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu về cách dùng của PreferenceActivity trong Android. Các bước thực hiện như sau:

**1.**Tạo xml resource cho Preference: Tạo một file xml trong thư mục xml ( nếu thư mục xlm chưa có trong thư mục res thì bạn hãy tạo thự mục xml trong thư mục res/xlm ). Trong ví dụ này tôi tạo 1 file pref_user_settings.xml trong thư mục xml.

2. Tạo 1 class mởi rộng từ class PreferenceActivity. Class này được dùng để load file layout settings của người dùng.

**3. **Gọi class chúng ta vừa tạo trong bước 2 từ bất kỳ nới nào chúng ta muốn. Bây giờ chúng ta sẽ đi từng bứơc từng bước một. Bước 1: tạo file xml cho Preference: Tạo file pref_user_settings.xml trong thư mục xlm . file này được dùng để định nghĩa giao diện của màn hình settings với 3 category khác nhau ở đây:

  • EditTextPreference được dùng để lấy nhập thông tin người dùng (giống như EditText trong widget ) . Trong ví dụ này tôi dùng để nhập password người dùng.
  • **CheckbokPreference ** cho phép bạn định nghĩa 1 giá trị kiểu Boolean .
  • ListPreference hiển thị 1 danh sách những lựa chọn để ngừơi dùng có thể lựa chọn.
<?xmlversion="1.0"encoding="utf-8"?>

<PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategoryandroid:title="SETTINGS">

        <EditTextPreference

            android:key="prefUserPassword"

            android:summary="Set Your Password"

            android:title="Password" />

    </PreferenceCategory>

    <PreferenceCategoryandroid:title="Security Settings">

        <CheckBoxPreference

            android:defaultValue="false"

            android:key="prefLockScreen"

            android:summary="Lock The Screen With Password"

            android:title="Screen Lock" />

        <ListPreference

            android:entries="@array/updateFrequencyLabel"

            android:entryValues="@array/updateFrequencyValues"

            android:key="prefUpdateFrequency"

            android:summary="Set Update Reminder Frequency"

            android:title="Reminder for Updation"/>

    </PreferenceCategory>

</PreferenceScreen>

Tôi sử dụng array ở đây nên  tôi sẽ tạo 1 file arrays.xlm trong thư mục values với nội dung như bên đưới.

<?xmlversion="1.0"encoding="utf-8"?>

<resources>

    <string-arrayname="updateFrequencyLabel">

        <item name="1">Daily</item>

        <item name="7">Weekly</item>

        <item name="365">Yearly</item>

        <item name="0">Never(I will Myself) </item>

    </string-array>

    <string-arrayname="updateFrequencyValues">

        <item name="1">1</item>

        <item name="7">7</item>

        <item name="365">365</item>

        <item name="0">0</item>

    </string-array>

</resources>

Bước 2: Tạo một class mở rộng từ class PreferneceActivtiy.

Tôi tạo một class UserSettingsActivity.java với nội dung như sau:

package com.techiedb.app.referenceactivity;

import com.techiedb.app.todooic.R;

import android.os.Bundle;
import android.preference.PreferenceActivity;

/**
* @author Hoqlq
* @date Nov 25, 2014
*/
public class UserSettingActivity extends PreferenceActivity{

@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_user_settings);
}

@Override
public void onBackPressed() {
super.onBackPressed();

}
}

Bước 3 : Gọi class UserSettingsActivity.java từ bất kỳ class nào bạn muốn.

Trong ví dụ này tôi tạo ra 1 class có tên là TodoActivity.java để gọi class UserSettingsActivity.java

+ xml cho TodoActivity.java

<RelativeLayoutxmlns: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">

    <Button

        android:id="@+id/button_user_settings"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_alignParentTop="true"

        android:layout_marginTop="50dp"

        android:text="User Settings"

        android:textSize="16sp"

        android:textStyle="bold"/>

     <Button

        android:id="@+id/button_show_settings"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_below="@+id/button_user_settings"

        android:layout_marginTop="20dp"

        android:text="Show User Settings"

        android:textSize="16sp"

        android:textStyle="bold"/>

    <TextView

        android:id="@+id/textview_content_settings"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_below="@+id/button_show_settings"

        android:layout_marginTop="20dp"

        android:gravity="left|center_horizontal"

        android:visibility="gone"/>

</RelativeLayout>

+ TodoAcitty.java

package com.techiedb.app.referenceactivity;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import com.techiedb.app.todooic.R;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class TodoActivity extends Activity {
public static final String APP_TAG = "com.techiedb.app.referenceactivity";

private Button btUserSettings, btShowSettings;
private TextView tvContentSettings;

private final OnClickListener handleClickEvent = new OnClickListener() {

@Override
public void onClick(View v) {

switch (v.getId()) {

case R.id.button_user_settings:
Intent i = new Intent(TodoActivity.this, UserSettingActivity.class);
startActivity(i);
break;
case R.id.button_show_settings:
displayUserSettings();
break;

default:
break;
}

}
};

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

this.btUserSettings = (Button)findViewById(R.id.button_user_settings);
this.btShowSettings = (Button)findViewById(R.id.button_show_settings);
this.tvContentSettings = (TextView)findViewById(R.id.textview_content_settings);

this.btUserSettings.setOnClickListener(this.handleClickEvent);
this.btShowSettings.setOnClickListener(this.handleClickEvent);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.todo, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

}

@Override
protected void onResume() {
super.onResume();

}

private void displayUserSettings(){
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(TodoActivity.this);
String settings = "";
settings = settings + "Password: " + sharedPrefs.getString("prefUserPassword", "NOPASSWORD");
settings = settings + "\nRemind For Update: " + sharedPrefs.getBoolean("prefLockScreen", false);
settings = settings + "\nUpdate Frequency: " + sharedPrefs.getString("prefUpdateFrequency", "NOUPDATE");

tvContentSettings.setVisibility(View.VISIBLE);
tvContentSettings.setText(settings);
}

}

Làm thế nào chúng ta lấy được dữ liệu người dùng đã nhập .

SharedPrefernces sharedPrefs = PrefernceManger.getDefaultSharedPreferences(Context).

Chúng ta cần cung cấp key chúng ta đã cho trong xlm(  android:key=_"prefUserPassword" trong pref_user_settings.xml _).

sharedPefs.getString(“”prefUserPassword”, “”NoPassword);

Như ở đây thì key là tham số thứ nhất, giá trị mặc định là tham số thứ 2 img1 img2 img4 img5 Các bạn có thể download source code tại đây.

Tài liệu tham khảo:

http://android-journey.blogspot.com/2010/01/for-almost-any-application-we-need-to.html http://developer.android.com/guide/topics/ui/settings.html#DefiningPrefs