2016-10-12 2 views
0

У меня возникли проблемы с добавлением страницы настроек в мое приложение.Добавление страницы настроек в приложение

Я создал параметр SettingsActivity, SettingsFragment, макет actibity_settings.xml и файл preferences.xml.

Я разместил кнопку в своем представлении activity_main и добавил намерение MainActivity вызвать функцию SettingsActivity.

Однако размещение кнопки, похоже, ничего не делает.

SettingsActivity

public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 

    private SharedPreferences pref; 

    public static void start(Context context) { 
     Intent intent = new Intent(context, SettingsActivity.class); 
     context.startActivity(intent); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_settings); 
     pref = PreferenceManager.getDefaultSharedPreferences(this); 
     pref.registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onDetachedFromWindow() { 
     pref.unregisterOnSharedPreferenceChangeListener(this); 
     super.onDetachedFromWindow(); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     // TODO handle any special logic on change of a preference if you want 
    } 
} 

SettingsFragment

public class SettingsFragment extends PreferenceFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
    } 
} 

MainActivity, опущены остальные методы.

public class MainActivity extends Activity implements OnClickListener { 

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_activity); 
     ... 
} 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_activity); 

    ActionBar bar = getActionBar(); 
    bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor(BAR_COLOUR))); 
    context = getApplicationContext(); 

    View createButton = findViewById(R.id.locate_button); 
    createButton.setOnClickListener(this); 
    latitudeTextView = (TextView) findViewById(R.id.latitude_textview); 
    latitudeTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.define_location, 0, 0, 0); 
    latitudeValueTextView = (TextView) findViewById(R.id.latitude_value_textview); 
    longitudeTextView = (TextView) findViewById(R.id.longitude_textview); 
    longitudeTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.define_location, 0, 0, 0); 
    longitudeValueTextView = (TextView) findViewById(R.id.longitude_value_textview); 
    accuracyTextView = (TextView) findViewById(R.id.accuracy_textview); 
    accuracyTextView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.info, 0, 0, 0); 
    accuracyValueTextView = (TextView) findViewById(R.id.accuracy_value_textview); 
    lastUpdateTextView = (TextView) findViewById(R.id.last_update_view); 
    lastUpdateValueTextView = (TextView) findViewById(R.id.last_update_date); 

    webView = (WebView) findViewById(R.id.map_view); 
    webView.setWebViewClient(new WebViewClient()); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.setVisibility(View.INVISIBLE); 

    isPermissionGiven(); 

} 

preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory 
     android:title="@string/pref_catOne" 
     android:key="pref_key_catOne" > 
     <CheckBoxPreference 
      android:key="mockCheckBox" 
      android:defaultValue="true" 
      android:title="@string/pref_mockCheckBoxOne" 
      android:summary="@string/pref_mockCheckBoxSummary" /> 
     <CheckBoxPreference 
      android:key="mockCheckBox" 
      android:defaultValue="true" 
      android:title="@string/pref_mockCheckBoxTwo" 
      android:summary="@string/pref_mockCheckBoxSummary" /> 
    </PreferenceCategory> 
    <PreferenceCategory 
     android:title="@string/pref_catTwo" 
     android:key="pref_key_catTwo" > 
    </PreferenceCategory> 
</PreferenceScreen> 

activity_settings.xml

<fragment 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    class="org.softshack.SettingsFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

main_activity.xml (только кнопка)

<Button 
     android:text="Button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/accuracy_textview" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:id="@+id/settingsButton" /> 
+0

Что происходит до сих пор? Можете ли вы дать нам какой-то контекст? В первую очередь запущена ли настройка настроек? –

+0

Он остается на той же странице и не запускает активность настроек. – Yoklan

+0

См. Мой обновленный ответ с полным рабочим примером страницы настроек. –

ответ

0

Я не поклонник вашего на клик шаблон, но если вы хотите сохранить его просто использовать:

View settingsButton = findViewById(R.id. settingsButton); 
settingsButton.setOnClickListener(this); 
+0

Кто-то еще в моей группе для этого задания сделал эту часть для нашего обучения. Я попробую это в методе onClick сейчас. – Yoklan

+0

Это похоже на работу, спасибо! Таким образом, способ, которым был выполнен метод onClick, был неправильным? Как это должно быть реализовано? – Yoklan

+0

Обычно для каждого элемента вы обычно устанавливаете отдельный элемент. Но я бы рекомендовал использовать [ButterKnife] (https://jakewharton.github.io/butterknife/). –

0

Ваш SettingsActivity должен простираться от PreferenceActivity, не активность:

public static class SettingsFragment extends PreferenceFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Load the preferences from an XML resource 
     addPreferencesFromResource(R.xml.preferences); 
    } 
    ... 
} 
+0

Он все еще не работает. Нажатие кнопки ничего не делает и не вызывает никаких ошибок. – Yoklan

+0

Вам нужно добавить немного больше кода, чтобы посмотреть на – RustWebDev

0

Вот полный пример всех частей, необходимых для страницы настроек.

Создание макета для деятельности activity_settings.xml:

<fragment 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    class="com.yourorg.yourapp.package.to.SettingsFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

Обновление class атр, чтобы отразить путь к SettingsFragment. Просто удалите его и начните вводить текст, и он должен автоматически заполниться в студии android.

Создать активность Настройки SettingsActivity.java:

public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 

    private SharedPreferences pref; 

    public static void start(Context context) { 
     Intent intent = new Intent(context, SettingsActivity.class); 
     context.startActivity(intent); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_settings); 
     pref = PreferenceManager.getDefaultSharedPreferences(this); 
     pref.registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onDetachedFromWindow() { 
     pref.unregisterOnSharedPreferenceChangeListener(this); 
     super.onDetachedFromWindow(); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     // TODO handle any special logic on change of a preference if you want 
    } 
} 

Создать SettingsFragment.java:

public class SettingsFragment extends PreferenceFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
    } 
} 
+0

Он по-прежнему не работает.Нажатие кнопки ничего не делает и не вызывает никаких ошибок. – Yoklan

+0

Я попробовал это с вашими изменениями, нажатие кнопки по-прежнему ничего не делает. Я обновлю код в своем исходном вопросе – Yoklan

+0

Вы объявили активность в своем «AndroidManifest.xml»? Можете ли вы поставить точку останова, где вызывается 'startActivity()', чтобы увидеть, даже ли он туда попал? –

Смежные вопросы