2011-01-16 31 views
6

Tôi hiện đã có màn hình tùy chọn và tôi đã tạo một lớp tùy chỉnh mở rộng DialogPreference và được gọi từ trong Tùy chọn của tôi. Dữ liệu tùy chọn của tôi dường như lưu trữ/truy xuất từ ​​SharedPreferences mà không có sự cố, nhưng tôi đang cố thêm 2 bộ cài đặt khác từ DialogPreference.Lưu vào SharedPreferences từ DialogPreference tùy chỉnh

Về cơ bản tôi có hai vấn đề mà tôi không thể tìm thấy. Mỗi trang web tôi đã thấy cung cấp cho tôi cùng một thông tin chuẩn để lưu/khôi phục dữ liệu và tôi vẫn gặp sự cố. Trước tiên, tôi đang cố gắng lưu tên người dùng và mật khẩu vào SharedPreferences (hiển thị trong khối mã cuối cùng) và nếu có thể tôi muốn có thể thực hiện điều đó trong số onClick().

sở thích của tôi XML mà các cuộc gọi của tôi DialogPreference:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

<PreferenceCategory> 
<com.rone.optusmon.AccDialog 
    android:key="AccSettings" 
    android:title="Account Settings" 
    android:negativeButtonText="Cancel" 
    android:positiveButtonText="Save" /> 

</PreferenceCategory> 
</PreferenceScreen> 

My tập tin Tuỳ chỉnh DialogPreference Class:

package com.rone.optusmon; 

import android.content.Context; 
import android.content.DialogInterface; 
import android.content.SharedPreferences; 
import android.preference.DialogPreference; 
import android.preference.PreferenceManager; 
import android.text.method.PasswordTransformationMethod; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import android.widget.Toast; 

public class AccDialog extends DialogPreference implements DialogInterface.OnClickListener { 


private TextView mUsername, mPassword; 
private EditText mUserbox, mPassbox; 
CharSequence mPassboxdata, mUserboxdata; 
private CheckBox mShowchar; 
private Context mContext; 

private int mWhichButtonClicked; 


public AccDialog(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mContext = context; 

} 

@Override 
protected View onCreateDialogView() { 

// Access default SharedPreferences 
@SuppressWarnings("unused") 
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(mContext); 


    @SuppressWarnings("unused") 
    LinearLayout.LayoutParams params; 
    LinearLayout layout = new LinearLayout(mContext); 
    layout.setOrientation(LinearLayout.VERTICAL); 
    layout.setPadding(10, 10, 10, 10); 
    layout.setBackgroundColor(0xFF000000); 

    mUsername = new TextView(mContext); 
    mUsername.setText("Username:"); 
    mUsername.setTextColor(0xFFFFFFFF); 
    mUsername.setPadding(0, 8, 0, 3); 

    mUserbox = new EditText(mContext); 
    mUserbox.setSingleLine(true); 
    mUserbox.setSelectAllOnFocus(true); 

    mPassword = new TextView(mContext); 
    mPassword.setText("Password:"); 
    mPassword.setTextColor(0xFFFFFFFF); 

    mPassbox = new EditText(mContext); 
    mPassbox.setSingleLine(true); 
    mPassbox.setSelectAllOnFocus(true); 

    mShowchar = new CheckBox(mContext); 
    mShowchar.setOnCheckedChangeListener(mShowchar_listener); 
    mShowchar.setText("Show Characters"); 
    mShowchar.setTextColor(0xFFFFFFFF); 
    mShowchar.setChecked(false); 
    if(!mShowchar.isChecked()) { 
    mPassbox.setTransformationMethod(new PasswordTransformationMethod()); 
    } 


    layout.addView(mUsername); 
    layout.addView(mUserbox); 
    layout.addView(mPassword); 
    layout.addView(mPassbox); 
    layout.addView(mShowchar); 

    return layout; 
} 


public void onClick(DialogInterface dialog, int which) { 
    mWhichButtonClicked = which; 
    // if statement to set save/cancel button roles 
    if (mWhichButtonClicked == -1) { 
    Toast.makeText(mContext, "Save was clicked\nUsername: " + mUserbox.getText().toString() +"\nPassword is: " + mPassbox.getText().toString(), Toast.LENGTH_SHORT).show();  
    // Save user preferences 
    SharedPreferences settings = getDefaultSharedPreferences(this); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putString("usernamekey", mUserbox.getText().toString()); 
    editor.putString("passwordkey", mPassbox.getText().toString()); 
    editor.commit(); 

    } 
    else { 
    Toast.makeText(mContext, "Cancel was clicked", Toast.LENGTH_SHORT).show(); 
    } 
} 
} 

chính mã kiểm tra hoạt động của tôi:

public void onResume() { 
    super.onResume(); 

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); 
    StringBuilder builder = new StringBuilder(); 

    builder.append("\nThe monitor will refresh every "+ pref.getString("refreshfreq", "30 minutes")); 
    builder.append("\nThe skin chosen is "+ pref.getString("skinkey", "null")); 
    builder.append("\nThe style chosen is "+ pref.getString("stylekey", "% used")); 
    builder.append("\nThe font chosen is "+ pref.getString("fontkey", "Calibri")); 
    builder.append("\nThe font color is "+ pref.getString("fontcolkey", "White")); 
    builder.append("\nYour username is "+ pref.getString("usernamekey", "not set yet")); 
    builder.append("\nYour password is "+ pref.getString("passwordkey", "not set yet")); 

    Toast.makeText(Optusmon.this, builder.toString(), Toast.LENGTH_LONG).show(); 

    } 

Phù SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); của tôi, Eclipse nói "Phương thức getDefaultSharedPreferences (AccD ialog) không được định nghĩa cho kiểu AccDialog ". Tôi đã cố gắng thay đổi ngữ cảnh thành lớp tùy chọn của mình, sử dụng ngữ cảnh trống và tôi cũng đã thử đặt tên cho SharedPrefs của mình và sử dụng getSharedPreferences(). Tôi không chắc chính xác những gì tôi đang làm ở đây.

Vì tôi khá mới đối với Java/Android/coding nói chung, bạn có thể vui lòng xem chi tiết nhất có thể với bất kỳ trợ giúp nào không, ví dụ: mà các tập tin của tôi, tôi cần phải viết mã trong và nơi ở trong tập tin đó tôi nên viết nó (tức là onCreate(), onClick(), vv)

Trả lời

3

Trong onCreate() bạn quay trở lại trước khi thực hiện dòng này, vì vậy Eclipse nói nó không thể truy cập . Trong onClick() thử của bạn:

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(mContext); 

nên OK

+0

Tôi không nghĩ rằng nó sẽ tạo ra sự khác biệt sau 'bố cục trả lại' vì nó nằm ngoài bố cục bất kể, nhưng tôi đã chuyển nó sang dòng sau khi "ViewCreateDialogView() {" được bảo vệ và sự cố đã biến mất. Nó cũng giải quyết vấn đề của tôi trong khối onClick(). Cảm ơn bạn – Ronnie

+0

Khi phương thức trả về, bạn không thể thực thi thêm mã sau đó ... – Falmarri

+0

Ah ok. Tôi đã đi qua một vấn đề khác sau khi thực hiện sửa chữa này và tôi đã chỉnh sửa mã trên và thêm một đoạn ở phía dưới để giải thích nó. Nó vẫn không có vẻ được tiết kiệm như dự định, hoặc người nào khác nó là nhưng tôi không đọc nó một cách chính xác. – Ronnie

0
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(mContext); 
+0

Tôi đã thử điều đó. Trong mã onCreate(), Eclipse cho biết đó là "mã không thể truy cập" và đề xuất tôi xóa toàn bộ dòng. Trong mã onClick() của tôi, lỗi giống như trước đây vẫn còn. – Ronnie

Các vấn đề liên quan