在PreferenceFragment中添加按钮

11

我想在我的首选项屏幕底部添加一些按钮,用于设置默认值和恢复默认值。 这个 答案没有涵盖如何在使用PreferenceFragment时实现此目的。有什么推荐的方法可以实现这个功能。

加载首选项片段的活动:

public class SettingsActivity extends Activity {

    @Override
    public void onCreate( Bundle savedInstanceState) {

        super.onCreate( savedInstanceState);

        // load up the preferences fragment
        getFragmentManager().beginTransaction().replace( android.R.id.content, new PrefsSettingsFragment()).commit();
    }
}

PreferenceFragment实现:

public class PrefsSettingsFragment extends PreferenceFragment {

    @Override
    public void onCreate( Bundle savedInstanceState) {

        super.onCreate( savedInstanceState);  

        addPreferencesFromResource( R.xml.preferences);             
    }       
}

偏好设置文件:preferences.xml

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

    <EditTextPreference android:key="edit_text_preference_server_address" android:title="@string/preference_server_address"/>
    <SwitchPreference android:key="switch_preference_bat" android:title="@string/preference_bat"/>
    <SwitchPreference android:key="switch_preference_comm" android:title="@string/preference_comm"/>
    <SwitchPreference android:key="switch_preference_dev_mode" android:title="@string/preference_dev_mode" android:defaultValue="true"/>

</PreferenceScreen>

1
我可能错了,但是不是用同样的方式吗?你只需要在底部定义自己的布局,并使用addPreferencesFromResource(...)来填充列表视图。虽然我不建议在屏幕底部悬浮按钮。除非你是指在列表视图底部? - StrikeForceZero
啊,你说得对。在我的活动xml中添加ListView和Button条目,并在getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsSettingsFragment()).commit()之后调用this.setContentView(R.layout.activity_settings),可以让我在底部获得一个按钮,就像我想要的那样。接下来要解决的问题是如何让这个按钮起作用。 - Namaste
1
重置为默认设置?为按钮设置onClickListner(),并调用PreferenceManager.setDefaultValues(context, PREFS_FILENAME, 0, R.xml.preferences, true);(如果您不想覆盖已设置的首选项,仅首次设置默认值,则为false)。 - StrikeForceZero
问题在于按钮无法点击。我试了一会儿也没有成功,所以我决定采用一个更简单的方法。屏幕底部漂浮的按钮也很尴尬。通过这种方法,它们可以出现在首选项列表的末尾。 - Namaste
4个回答

10

我遇到了同样的问题,我找到了一种处理这个问题的方法。

覆盖PreferenceFragment中的onCreateView方法,使用传入参数的LayoutInfalter创建自己的View,并返回此View。

以下是我的代码。希望对你有所帮助。

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        View v = inflater.inflate(R.layout.set_alarm, null);

        Button save = (Button)v.findViewById(R.id.save);
        Button revert = (Button)v.findViewById(R.id.revert);
        Button delete = (Button)v.findViewById(R.id.delete);

        save.setOnClickListener(this);
        revert.setOnClickListener(this);
        delete.setOnClickListener(this);

        if(mId == -1){
            delete.setEnabled(false);
        }

        return v;
    }

9
我稍微修改了之前的帖子,以便按钮附加在视图底部。
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        LinearLayout v = (LinearLayout) super.onCreateView(inflater, container, savedInstanceState);

        Button btn = new Button(getActivity().getApplicationContext());
        btn.setText("Button on Bottom");

        v.addView(btn);
        btn.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
            }
        });

        return v;
    }

通过在PreferenceFragment子类中覆盖(通过IDE,略有不同的方法签名)onCreateView对我起了作用。 - knarf

5
只需创建自己的设置活动布局,其中包含ID为@android:id/list的列表视图。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/fragment"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp">
        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </FrameLayout>

    <Button
        android:id="@+id/button"
        android:text="Save"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

然后在活动类中,在添加首选项片段之前设置内容视图。

public class SettingsActivity extends Activity {

    @Override
    public void onCreate( Bundle savedInstanceState) {    
        super.onCreate( savedInstanceState);
        setContentView(R.layout.settings_activity)

        // load up the preferences fragment
        getFragmentManager().beginTransaction().replace( android.R.id.content, new PrefsSettingsFragment()).commit();
    }
}

这个按钮能点吗?我的onClickListener在这种情况下没有触发... - rdehuyss

1
你可以尝试这个。
@Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            LinearLayout v = (LinearLayout) super.onCreateView(inflater, container, savedInstanceState);

            Button SendLogbtn = new Button(getActivity().getApplicationContext());
            SendLogbtn.setText("send log file");

            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);

            params.setMargins(100, 0, 0, 500);
            SendLogbtn.setLayoutParams(params);

            v.addView(SendLogbtn);

            SendLogbtn.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {

                    // do your code 

                }
            });

            return v;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接