2

I'm using this CheckBoxPreference Class to support RTL text direction for pre Android 4.2 versions and to use a custom font style for my preference

public class MyCheckBoxPreference extends CheckBoxPreference {


   TextView txtTitle, txtSum;
   View Custmv;


   public MyCheckBoxPreference(Context context) {
    super(context);
}

   public MyCheckBoxPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
}

   public MyCheckBoxPreference(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

   @Override
   protected void onBindView(@NonNull View view) {
    super.onBindView(view);
       Context context = getContext();
       txtTitle = (TextView) view.findViewById(android.R.id.title);
       txtTitle.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Regular.ttf"));
       txtSum = (TextView) view.findViewById(android.R.id.summary);
       txtSum.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Regular.ttf"));
}

   @Override
   protected View onCreateView(ViewGroup parent) {
       Context ccc = getContext();
       LayoutInflater inflater = (LayoutInflater) ccc.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       Custmv = inflater.inflate(R.layout.arabic_checkboxpreference_layout, parent, false);
    return Custmv;
}

and I'm using it in my prefs.xml like so:

<com.app.myclasses.MyCheckBoxPreference
        android:defaultValue="false"
        android:key="cb_big"
        android:summaryOff="@string/off"
        android:summaryOn="@string/on"
        android:title="@string/Show_Big_Text" />

And here is the arabic_checkboxpreference_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingRight="?android:attr/scrollbarSize"
android:id="@+id/sos">

<CheckBox
    android:id="@+android:id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:layout_marginLeft="16dip"
    android:minWidth="56dp"
    android:gravity="center"
    android:layout_gravity="center" />

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginRight="16dip"
    android:layout_marginTop="6dip"
    android:layout_marginBottom="6dip"
    android:layout_weight="1"
    android:gravity="end">

    <TextView
        android:id="@+android:id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textAppearance="?android:attr/textAppearanceMedium"

        android:ellipsize="marquee"
        android:fadingEdge="horizontal"
        android:textColor="?android:attr/textColorPrimary"
        android:text="Title"
        android:layout_alignParentRight="true" />

    <TextView
        android:id="@android:id/summary"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@android:id/title"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:maxLines="3"
        android:text="subTitle"
        android:layout_alignRight="@android:id/title"
        android:textColor="?android:attr/textColorSecondary" />

</RelativeLayout>

Every thing works great, but the problem is when using more than one instance of my custom class, I mean when using multiple CheckBoxPreferences in prefs.xml and when clicking on a CheckBoxPreference it becomes focused for a while (~ 1-2 seconds) before getting checked or unchecked. Any idea please?

enter image description here

Edit:

According to kha answer I removed the initialization from the onBind method to the constructor and every thing is smooth now:

public MyCheckBoxPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.mTypeface = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Regular.ttf");
    this.Custmv = View.inflate(context, R.layout.arabic_checkboxpreference_layout, null);
    TextView txtTitle = (TextView) Custmv.findViewById(android.R.id.title);
    txtTitle.setTypeface(mTypeface);
    TextView txtSum = (TextView) Custmv.findViewById(android.R.id.summary);
    txtSum.setTypeface(mTypeface);
}
Community
  • 1
  • 1
Leebeedev
  • 2,126
  • 22
  • 31
  • No idea about why it's so slow when you call but it may be related to the fact you load `Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Regular.ttf")` every time you're binding the view. Try moving it out from your method and create it once in your view instead and use the reference when you need to set the font and see if that makes any difference. – kha Apr 02 '15 at 20:20
  • @kha I tried your suggestion with no luck. Still the same prob – Leebeedev Apr 02 '15 at 20:28
  • @kha add your comment as an answer, because it works fine now according to your advice – Leebeedev Apr 02 '15 at 22:26

1 Answers1

0

It may be related to the fact you load the font with Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Regular.ttf")every time you're binding the view.

Try moving it out from your onBindView method and create it once in your view instead and use the reference when you need to set the font and see if that makes any difference

Jonas Czech
  • 12,018
  • 6
  • 44
  • 65
kha
  • 19,123
  • 9
  • 34
  • 67