Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何在自定义首选项(布局)中使用非默认SharedReference(数据)_Android_Android Preferences_Android Sharedpreferences - Fatal编程技术网

Android:如何在自定义首选项(布局)中使用非默认SharedReference(数据)

Android:如何在自定义首选项(布局)中使用非默认SharedReference(数据),android,android-preferences,android-sharedpreferences,Android,Android Preferences,Android Sharedpreferences,对于此机会,我需要使用非默认(即自定义)SharedReference数据。如何在自定义首选项布局中访问此自定义SharedReference数据?在这种情况下,I不能使用getDefaultSharedReferences(上下文) 我构建了一个自定义的listpreference,允许向其中添加新元素。 我必须使用安卓4。对于这个不太重要的问题 简单的main活动只是显示只有一个自定义首选项布局的首选项列表 public class MainActivity extends Preferen

对于此机会,我需要使用非默认(即自定义)SharedReference数据。如何在自定义首选项布局中访问此自定义SharedReference数据?在这种情况下,I不能使用getDefaultSharedReferences(上下文)

我构建了一个自定义的listpreference,允许向其中添加新元素。 我必须使用安卓4。对于这个不太重要的问题

简单的main活动只是显示只有一个自定义首选项布局的首选项列表

public class MainActivity extends PreferenceActivity  {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        PreferenceManager prefMgr = getPreferenceManager();
        prefMgr.setSharedPreferencesName("my_preferences");
        prefMgr.setSharedPreferencesMode(MODE_PRIVATE);
        try {
            addPreferencesFromResource( R.xml.preferences);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
res/xml/preferences.xml文件包含:

<nl.xyz.listpreferenceexpandable.ListPreferenceExpandable
        android:key="custom3"
        android:title="CustomList3"
        android:dialogTitle="Add custom item"
        android:entries="@array/customdata1"
        android:entryValues="@array/customdata1"/>

自定义ListPreference代码如下所示。 问题是:如何访问名为“my_preferences”的自定义共享首选项数据? 当我只调用一个getPreferenceManager()时,就会得到null

public class ListPreferenceExpandable extends ListPreference {
    CustomListPreferenceAdapter customListPreferenceAdapter = null;
    Context mContext;
    private LayoutInflater mInflater;
    List<String> entries;
    ArrayList<RadioButton> rButtonList;
    SharedPreferences prefs;
    SharedPreferences.Editor editor;
    String current;
    String keyDefault;
    String keyData;

    public ListPreferenceExpandable(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        mInflater = LayoutInflater.from(context);
        rButtonList = new ArrayList<RadioButton>();
        // THIS IS WRONG: 
        prefs = PreferenceManager.getDefaultSharedPreferences(context);
        // QUESTION: How can I access SharedPreference "my_preferences"
        editor = prefs.edit();
        keyDefault = getKey();
        keyData = getKey() + "_data"; // will hold the dynamically data          
        String prefDefault = getPersistedString( getKey() );
        current = prefs.getString( keyDefault, prefDefault);
        setSummary( current);
    }

    @Override
    protected void onPrepareDialogBuilder(Builder builder) {
        getData();
        customListPreferenceAdapter = new CustomListPreferenceAdapter(mContext);
        builder.setAdapter(customListPreferenceAdapter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                System.out.println( "Clicked ... on " + which);
            }
        });
        builder.setNeutralButton( "Add", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                inputDialog( "Add new entry");
            }
        });
    }

    private void getData() {
        String data = prefs.getString( keyData, "");
        if( data.isEmpty()) {
            entries = new ArrayList<>();
            CharSequence[] loadedFromTheResource = getEntries();
            if( loadedFromTheResource == null || loadedFromTheResource.length < 1) {
                loadedFromTheResource = getEntryValues();
            }
            if( loadedFromTheResource != null && loadedFromTheResource.length > 0) {
                for (CharSequence cs : loadedFromTheResource) {
                    entries.add(cs.toString());
                }
            }
        } else {
            String[] loaded = data.split("\\s*#\\s*");
            if( loaded != null && loaded.length > 0) {
                entries = Arrays.asList( loaded);
                entries = new ArrayList<>(entries);
            }
        }
        if( entries.isEmpty()) {
            entries.add(current);
        }
    }
    private void saveData() {
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString( keyData, TextUtils.join("#", entries));
        editor.apply();
    }

    void inputDialog( String title) {
        Builder builder = new Builder( mContext); // this
        builder.setTitle(title);
        final EditText input = new EditText( mContext); // this
        input.setInputType(InputType.TYPE_CLASS_TEXT);
        builder.setView(input);
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String newEntry = input.getText().toString();
                entries.add( newEntry);
                customListPreferenceAdapter.notifyDataSetChanged();
                saveData();
            }
        });
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        builder.show();
    }

    static class ViewHolder {
        protected TextView nameT = null;
        protected TextView formulaT = null;
    }

    private class CustomListPreferenceAdapter extends BaseAdapter {
        private int mSelectedPosition = -1;
        private RadioButton mSelectedRB;

        public CustomListPreferenceAdapter(Context context) { }
        public int getCount() {
            return entries.size();
        }
        public Object getItem(int position) {
            return position;
        }
        public long getItemId(int position) {
            return position;
        }

        public View getView(final int position, View convertView, ViewGroup parent) {
            View row = convertView;
            CustomHolder holder;
            if(convertView == null) {
                row = mInflater.inflate(R.layout.custom_list_preference_row, parent, false);
                holder = new CustomHolder( row, position);
                row.setTag(holder);
            } else {
                holder = (CustomHolder) row.getTag();
            }
            holder.row.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String current = entries.get(position).toString();
                    editor.putString(keyDefault, current).apply();
                    setSummary(current);
                    Dialog mDialog = getDialog();
                    mDialog.dismiss();
                }
            });
            String currentSelection = prefs.getString( keyDefault, "");
            if( entries.get(position).equals( currentSelection)) {
                holder.rButton.setChecked(true);
            } else {
                holder.rButton.setChecked(false);
            }
            holder.text.setText( entries.get(position));
            return row;
        }

        class CustomHolder  {
            private TextView text = null;
            private RadioButton rButton = null;
            private View row = null;

            CustomHolder( View row, int position1)  {
                text = (TextView)row.findViewById(R.id.custom_list_view_row_text_view);
                rButton = (RadioButton)row.findViewById(R.id.custom_list_view_row_radio_button);
                this.row = row;
            }
            public RadioButton getRadioButton() {
                return rButton;
            }
        }
    }
}
公共类ListPreferenceExpandable扩展ListPreference{
CustomListPreferenceAdapter CustomListPreferenceAdapter=null;
语境;
私人停车场;
列出条目;
ArrayList按钮列表;
共享引用优先权;
SharedReferences.Editor;
串电流;
字符串键默认值;
字符串键数据;
公共列表首选项可扩展(上下文、属性集属性){
超级(上下文,attrs);
mContext=上下文;
mInflater=LayoutInflater.from(上下文);
rButtonList=newarraylist();
//这是错误的:
prefs=PreferenceManager.GetDefaultSharedReferences(上下文);
//问题:我如何访问SharedReference“我的首选项”
editor=prefs.edit();
keyDefault=getKey();
keyData=getKey()+“_data”;//将动态保存数据
String prefDefault=getPersistedString(getKey());
current=prefs.getString(keyDefault,prefdault);
设置摘要(当前);
}
@凌驾
受保护的无效onPrepareDialogBuilder(生成器){
getData();
customListPreferenceAdapter=新的customListPreferenceAdapter(mContext);
setAdapter(customListPreferenceAdapter,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
System.out.println(“单击“+which”);
}
});
builder.setNeutralButton(“添加”,新建DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
输入对话框(“添加新条目”);
}
});
}
私有void getData(){
字符串数据=prefs.getString(keyData,“”);
if(data.isEmpty()){
entries=newarraylist();
CharSequence[]loadedFromTheResource=getEntries();
if(loadedFromTheResource==null | | loadedFromTheResource.length<1){
loadedFromTheResource=getEntryValues();
}
if(loadedFromTheResource!=null&&loadedFromTheResource.length>0){
用于(字符序列cs:loadedFromTheResource){
entries.add(cs.toString());
}
}
}否则{
String[]loaded=data.split(\\s*#\\s*);
如果(已加载!=null&&load.length>0){
条目=数组.asList(已加载);
条目=新的ArrayList(条目);
}
}
if(entries.isEmpty()){
条目。添加(当前);
}
}
私有void saveData(){
SharedReferences.Editor=prefs.edit();
putString(keyData,TextUtils.join(“#”,entries));
editor.apply();
}
无效输入对话框(字符串标题){
Builder=newbuilder(mContext);//这个
建造商名称(名称);
最终编辑文本输入=新编辑文本(mContext);//此
input.setInputType(InputType.TYPE\u CLASS\u TEXT);
builder.setView(输入);
setPositiveButton(“确定”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
String newEntry=input.getText().toString();
条目。添加(新条目);
customListPreferenceAdapter.notifyDataSetChanged();
saveData();
}
});
setNegativeButton(“取消”,新建DialogInterface.OnClickListener()){
@凌驾
public void onClick(DialogInterface dialog,int which){
dialog.cancel();
}
});
builder.show();
}
静态类视窗夹{
受保护的文本视图名称t=null;
受保护的TextView formulaT=null;
}
私有类CustomListPreferenceAdapter扩展了BaseAdapter{
private int mSelectedPosition=-1;
专用单选按钮mSelectedRB;
公共CustomListPreferenceAdapter(上下文){}
public int getCount(){
返回条目。size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图行=转换视图;
客户持有人;
if(convertView==null){
行=mInflater.flate(R.layout.custom\u list\u preference\u行,父项,false);
持有人=新的客户持有人(行、位置);
row.setTag(支架);
}否则{
holder=(CustomHolder)行。getTag();
}
holder.row.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
字符串current=entries.get(position.toString();
编辑器.putString(keyDefau
<string-array name="customdata1">
  <item name="One">One</item>
  <item name="Two">Two</item>
</string-array>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/custom_list_view_row_table_row"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="8dip"
    android:paddingTop="8dip"
    android:paddingLeft="10dip"
    android:paddingRight="10dip">

    <TextView
        android:id="@+id/custom_list_view_row_text_view"
        android:textSize="22sp"
        android:textColor="#000000"
        android:gravity="center_vertical"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content" />

    <RadioButton
        android:checked="false"
        android:layout_width="40dp"
        android:layout_weight="0"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:id="@+id/custom_list_view_row_radio_button"/>

</LinearLayout>
<nl.xyz.listpreferenceexpandable.ListPreferenceExpandable
        android:key="custom3"
        android:title="CustomList3"
        android:dialogTitle="Add custom item"
        android:entries="@array/customdata1"
****    sharedPreference="sharedpreferences_of_targetgroup_n" ****
        android:entryValues="@array/customdata1"/>
String sharedPreference = attrs.getAttributeValue(null, "sharedPreference");
if( sharedPreference == null || sharedPreference.isEmpty()) {
    prefs = PreferenceManager.getDefaultSharedPreferences(context);
} else {
    prefs = context.getSharedPreferences(sharedPreference, MODE_PRIVATE);
}