3

How do I open up into a nested PreferenceScreen to a particular preference from an activity (such as through an intent)?

Example:

<PreferenceScreen

 ...
<!-- opens a subscreen of settings -->
<PreferenceScreen
    android:key="sub_menu_key"
    android:persistent="false"
    android:title="Submenu">

    ...

    <PreferenceCategory
        android:key="category_key"
        android:title="Category">
     ...

        <Preference
            android:key="tos_key"
            android:title="Terms of Service" />
     ...
    </PreferenceCategory>
</PreferenceScreen>
...

Is there a way to open directly to where "Terms of Service" is visible.

NappyXIII
  • 195
  • 2
  • 17

2 Answers2

0

You just need to delare the specified Preference class in your onResume() method. In my case I was using SwitchPreference class, therefore the code would be like - SettingsActivity.class

public static class PrivacyPreferenceFragment extends PreferenceFragment {
    public SwitchPreference switchPreference;

    @Override
    public void onResume() {
        super.onResume();
        switchPreference = (SwitchPreference) findPreference("privacy_notice_check");
    }

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref_privacy);
        setHasOptionsMenu(true);

    }
}

Then in the activity where you want to use the PreferenceFragment value, just use the SharedPreference object to call the values and trigger it.

If you want the SharedPreference logic just comment below.

MagicUnderHood
  • 320
  • 3
  • 10
Prajwal Waingankar
  • 2,534
  • 2
  • 13
  • 20
  • I worked on this preference activity to display privacy notice to people if the switchprefence was set to ON otherwise do not display the notice if set to off. – Prajwal Waingankar Jun 25 '19 at 06:54
-1

From an Activity (es: Main Activity) you can use an explicit intent

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

    goToPreference = (Button) findViewById(R.id.goToButton);
    goToPreference.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // when you click go to Preference
            Intent intent = new Intent( MainActivity.this, UserSettingsActivity.class);
            startActivity(intent);
        }
    });
}
}

Layout: activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns: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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="it.uniba.di.ivu.di.sms16.gruppox.examplesettings.MainActivity">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Go To Preference"
    android:id="@+id/goToButton"
    android:layout_centerVertical="true"
    android:layout_centerHorizontal="true" />

</RelativeLayout>

UserSettingsActivity is an activity that extends PreferenceActivity and allows you to view preference

import android.content.SharedPreferences; 
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.os.Bundle;

public class UserSettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    addPreferencesFromResource(R.xml.settings);
    PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

    if(key.equals("lenguage_preference"))
    {
         // TO DO
    }
}

@Override
protected void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
}
}

settings.xml

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

<PreferenceCategory
    android:title="Lenguage">

    <ListPreference
        android:key="lenguage_preference"
        android:title="Change Lenguage"
        android:summary="Choose yout language"
        android:entries="@array/entries_list_preference2"
        android:entryValues="@array/entryvalues_list_preference2"
        android:dialogTitle="choose favourite language" />

</PreferenceCategory>

<PreferenceCategory
    android:title="Distance">

    <ListPreference
        android:key="distance_preference"
        android:title="Distance"
        android:summary="Change distance"
        android:entries="@array/entries_list_preference"
        android:entryValues="@array/entryvalues_list_preference"
        android:dialogTitle="choose favourite distance" />

</PreferenceCategory>

arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string-array name="entries_list_preference"
    translatable="false">

    <item>2 (km)</item>
    <item>1 (km)</item>
    <item>500 (m)</item>
    <item>200 (m)</item>

</string-array>

<string-array name="entryvalues_list_preference"
    translatable="false">
    <item>2000</item>
    <item>1000</item>
    <item>500</item>
    <item>200</item>
</string-array>

<string-array name="entries_list_preference2"
    translatable="false">
    <item>Italian</item>
    <item>English</item>
    <item>French</item>

</string-array>

<string-array name="entryvalues_list_preference2"
    translatable="false">
    <item>it</item>
    <item>en</item>
    <item>fr</item>

</string-array>

Is there a way to open directly to "Terms of Service"?

I think you can refer to How to open or simulate a click on an android Preference, created with XML, programmatically?

Community
  • 1
  • 1
Giupo
  • 62
  • 7
  • By going directly to "Terms of Service", I just mean going to the view where you will see that preference. Moving directly to a PreferenceScreen submenu. But thanks for this suggestion, I'll look into this as well. – NappyXIII Jul 08 '16 at 16:05