2017-01-25 8 views
0

Я пытаюсь создать активность настроек, но по какой-то причине мой переключатель Control не ведет себя так, как он должен. Это предотвращает разрушение желаемого itms + сбой приложения, когда я перехожу к SettingsActivity. Я действительно не понимаю, почему это происходит, когда компонент явно объявлен. Ниже мой код (код для страниц 2 и 3 были опущены, чтобы не загромождать в моем вопросе):Элементы в разных действиях, которые не сворачиваются

activity_page1.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:id="@+id/activity_page1" 
    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="com.apptacularapps.settingsapp.Page1Activity"> 

    <View 
     android:id="@+id/blue_square" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="20dp" 
     android:background="@drawable/shape_blue_square" /> 

    <View 
     android:id="@+id/blue_circle" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:layout_centerHorizontal="true" 
     android:background="@drawable/shape_blue_circle" 
     android:layout_marginBottom="20dp" 
     android:layout_below="@id/blue_square"/> 

    <View 
     android:id="@+id/blue_rectangle" 
     android:layout_width="300dp" 
     android:layout_height="100dp" 
     android:layout_centerHorizontal="true" 
     android:background="@drawable/shape_blue_rectangle" 
     android:layout_below="@id/blue_circle"/> 

</RelativeLayout> 

Page1Activity.java

public class Page1Activity extends AppCompatActivity { 

    boolean squareState; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_page1); 
    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     loadPreferences(); 
     displaySettings(); 
    } 

    public void loadPreferences(){ 
     SharedPreferences pref = getSharedPreferences("settings", AppCompatActivity.MODE_PRIVATE); 
     squareState = pref.getBoolean("square_state", true); 
    } 

    public void displaySettings() { 
     if (squareState) { 
      findViewById(R.id.blue_square).setVisibility(View.VISIBLE); 
     } else { 
      findViewById(R.id.blue_square).setVisibility(View.GONE); 
     } 
    } 
} 

деятельность_settings.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" 
tools:context="com.packagename.settingsapp.SettingsActivity"> 

<android.support.v7.widget.SwitchCompat 
    android:id="@+id/square_switch" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:checked="true" 
    android:layout_margin="20dp" 
    android:text="Show squares" 
    style="@android:style/TextAppearance.Large" /> 

<android.support.v7.widget.SwitchCompat 
    android:id="@+id/circle_switch" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:checked="true" 
    android:layout_margin="20dp" 
    android:text="Show circles" 
    style="@android:style/TextAppearance.Large" 
    android:layout_below="@id/square_switch"/> 

<android.support.v7.widget.SwitchCompat 
    android:id="@+id/rectangle_switch" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:checked="true" 
    android:layout_margin="20dp" 
    android:text="Show rectangles" 
    style="@android:style/TextAppearance.Large" 
    android:layout_below="@id/circle_switch"/> 

</RelativeLayout> 

SettingsActivity.java

public class SettingsActivity extends AppCompatActivity { 

    boolean squareState; 
    SwitchCompat squareSwitch; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_settings); 
    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     loadPreferences(); 
     displaySettings(); 
    } 

    public void loadPreferences(){ 
     SharedPreferences pref = getSharedPreferences("settings", AppCompatActivity.MODE_PRIVATE); 
     squareState = pref.getBoolean("square_state", true); 
    } 

    public void displaySettings(){ 
     squareSwitch.setChecked(squareState); 
    } 

    @Override 
    public void onPause(){ 
     super.onPause(); 
     savePreferences(); 
    } 

    private void savePreferences(){ 
     SharedPreferences pref = getSharedPreferences("settings", AppCompatActivity.MODE_PRIVATE); 
     SharedPreferences.Editor editor = pref.edit(); 
     editor.putBoolean("square_state", squareState); 
     editor.apply(); 
    } 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

     int id = buttonView.getId(); 

     switch(id){ 
      case R.id.square_switch: 
       squareState = isChecked; 
       break; 
     } 
    } 
} 

Текущий результат enter image description here

Ожидаемый результат enter image description here

ответ

1

Вы не прикрепление squareSwitch для любого компонента пользовательского интерфейса. Обновите ваш SettingsActivity.java к следующему:

public class SettingsActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener { 

boolean squareState; 
SwitchCompat squareSwitch; 

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

     squareSwitch = (SwitchCompat)findViewById(R.id.square_switch); //add this line 
     squareSwitch.setOnCheckedChangeListener(this); //Also add this 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    loadPreferences(); 
    displaySettings(); 
} 

public void loadPreferences(){ 
    SharedPreferences pref = getSharedPreferences("settings", AppCompatActivity.MODE_PRIVATE); 
    squareState = pref.getBoolean("square_state", true); 
} 

public void displaySettings(){ 
    squareSwitch.setChecked(squareState); 
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    savePreferences(); 
} 

private void savePreferences(){ 
    SharedPreferences pref = getSharedPreferences("settings", AppCompatActivity.MODE_PRIVATE); 
    SharedPreferences.Editor editor = pref.edit(); 
    editor.putBoolean("square_state", squareState); 
    editor.apply(); 
} 

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

    int id = buttonView.getId(); 

    switch(id){ 
     case R.id.square_switch: 
      squareState = isChecked; 
      break; 
    } 
} 

Кроме того, вам не нужно реализовывать CompoundButton.OnCheckedChangeListener и переопределить onCheckedChanged в Page1Activity вы можете удалить те оттуда.

+0

вам нужно бросить его, нажать alt + enter, и он покажет предложение бросить его. также обновил ответ. – Saurabh

+0

обновленный ответ. – Saurabh

+0

Знаете ли вы, как решить эту проблему? Я пытался решить это в течение нескольких месяцев (из-за отсутствия учебников): [ссылка на другой вопрос] (http://stackoverflow.com/questions/41961805/fragment-item-wont-collapse) – MacaronLover

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

  • Нет связанных вопросов^_^