2016年2月29日月曜日

PreferenceFragmentを使って複雑なViewGroupを表示・操作したい場合

PreferenceFragmentを使って複雑なViewGroupを表示・操作したい場合

表示する画面のxml:preference_version.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:autoLink="web"
        android:text="@string/test"
        >
    </TextView>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:paddingTop="20dp"
            android:text="@string/app_name"
            >
        </TextView>
        <TextView
            android:id="@+id/TextView_Preference_Version"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:paddingTop="20dp"
            >
        </TextView>
    </RelativeLayout>
</LinearLayout>

\res\xml\preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <PackageName.VersionPreference
        android:key="PreferenceScreen_Version"
        android:layout="@layout/preference_version"ここがポイント
widgetLayoutを使うと適切に表示されない。
        >
    </PackageName.VersionPreference>
</PreferenceScreen>

PackageName.VersionPreference.java
public class VersionPreference extends Preference{
    private Context con;
    public VersionPreference(Context context){
        super(context);
        con = context;
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public VersionPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        con = context;
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public VersionPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        con = context;
    }

    public VersionPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        con = context;
    }

    @Override
    protected void onBindView(View view){
        super.onBindView(view);
        LinearLayout llParent = (LinearLayout) view;
        TextView tv = (TextView) llParent.findViewById(R.id.TextView_Preference_Version);
        PackageInfo pi;
        try{
            pi = con.getPackageManager().getPackageInfo(
                    con.getPackageName(),
                    PackageManager.GET_ACTIVITIES
            );
            Resources r = con.getResources();
            String s = r.getString(R.string.Version) + pi.versionName;
            tv.setText(s);
        }
        catch(PackageManager.NameNotFoundException e){
        }
    }
}

0 件のコメント:

コメントを投稿