0

起動時に読み込まれる設定アクティビティ HomeActivity があります。特定の要件により、起動モードは singleTask に設定されています。HomeActivity のレイアウトには、アイコン、タイトル、およびスイッチを含む要素があります。アイデアは、スイッチを使用して通話を有効/無効にできるはずだということです。行 (スイッチの外側) をクリックすると、CallPreferences という新しいアクティビティが表示され、Call 固有の設定を行うことができます。CallPreferences のアクション バーには、ユーザーが再び通話を有効/無効にできるスイッチも存在する必要があります。両方のアクティビティのスイッチは、「現実」を反映する必要があります。つまり、スイッチが変更されると、値が共有設定に保存されます。次に、両方のスイッチが共有設定 onCreate から読み取り、値を on または off に設定します。

HomeActivity の xml には、次のような設定画面があります。

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

    <com.xxx.yy.preferences.IconSwitchPreference
        foo:icon="@drawable/call_icn"        
        android:title="@string/call"
        android:key="callIconSwitchPreference" >
        <intent
            android:action="android.intent.action.VIEW"
            android:targetClass="com.xxx.yy.preferences.CallPreferences"
            android:targetPackage="om.xxx.yy" />
    </com.xxx.yy.preferences.IconSwitchPreference>

</PreferenceScreen>

IconSwitchPreference は、線形レイアウト、タイトルのテキスト ビュー、画像ビュー、およびスイッチを含む、私のカスタム設定レイアウトです。

<?xml version="1.0" encoding="utf-8"?>
<!-- Layout for a Preference in a PreferenceActivity. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical"
    android:paddingRight="?android:attr/scrollbarSize">

   <Switch
        android:id="@+id/menu_switch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:onClick="onMenuSwitchClicked" />

</LinearLayout>

そして、コードを実行するクラス:

public class IconSwitchPreference extends IconPreference {

public IconSwitchPreference(Context context) {
    this(context, null);
}

public IconSwitchPreference(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public IconSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setLayoutResource(R.layout.preference_icon_switch);        
        if (attrs != null) {
            int iconResId = attrs.getAttributeResourceValue(XMLNS, "icon", 0);
            mIcon = context.getResources().getDrawable(iconResId);            
            mFilter = attrs.getAttributeValue(XMLNS, "filter");
            mUrl = attrs.getAttributeValue(XMLNS, "url");
        }
    }   
}

CallPreferences では、プログラムでスイッチを作成し、アクション バーに追加します。

private void createActionBarSwitch() {
    ActionBar actionBar = getActionBar();
    Switch actionBarSwitch = new Switch(this);

    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
            ActionBar.DISPLAY_SHOW_CUSTOM);
    actionBar.setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
            ActionBar.LayoutParams.WRAP_CONTENT,
            ActionBar.LayoutParams.WRAP_CONTENT, Gravity.CENTER_VERTICAL
                    | Gravity.RIGHT));

    actionBarSwitch.setChecked(isSwitchOn());
}

これは機能し、スイッチを保存された値に設定でき、スイッチは値を反映するように更新されます。

ただし、HomeActivity では、値を反映するようにスイッチが更新されません。

以下は機能しませ

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LayoutInflater inflater = getLayoutInflater();
    View view = inflater.inflate(R.layout.preference_icon_switch, null);
    TextView tv = (TextView)view.findViewById(android.R.id.title);
    tv.setText("Test");
    Switch menuSwitch = (Switch)view.findViewById(R.id.menu_switch);
    menuSwitch.setChecked(sharedPrefs.isCallhandlingEnabled());
}

テキスト ビューはテスト用に変更されず、スイッチも有効になりません (デフォルト値は false)。

ただし、以下は機能します。

final IconSwitchPreference ic = (IconSwitchPreference) findPreference("callIconSwitchPreference");
ic.setTitle("Test");

タイトルは「テスト」に設定されています。唯一の問題は、スイッチへの参照がないため、その値を更新できることです。IconSwitchPreference.java を更新して、スイッチへの参照を抽出し、使用されている xml に保存できますか?

いくつかのソリューションとコード サンプルを試しました。しかし、それらのすべてには、機能していないものがあります。もう 1 つの解決策は、標準の SwitchPreference を使用することですが、スイッチ自体をクリックしてその状態を変更する (新しいアクティビティに移動せずに) と、行をクリックしてアクティビティに入る (スイッチを変更せずに) に違いはありません。価値)。

4

1 に答える 1