]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - src/com/hughes/android/dictionary/DictionaryActivity.java
Simplify adding a ClickableLink span.
[Dictionary.git] / src / com / hughes / android / dictionary / DictionaryActivity.java
index 43c9003a123e4eb3387a68eacc7f793c9d2f4c23..9bf6dbabe9e159102dbfbde3d618ace30e6358a1 100644 (file)
@@ -39,6 +39,7 @@ import android.support.v7.widget.Toolbar;
 import android.text.ClipboardManager;
 import android.text.InputType;
 import android.text.Spannable;
+import android.text.SpannableString;
 import android.text.method.LinkMovementMethod;
 import android.text.style.ClickableSpan;
 import android.text.style.StyleSpan;
@@ -229,6 +230,8 @@ public class DictionaryActivity extends ActionBarActivity {
     private void dictionaryOpenFail(Exception e) {
         Log.e(LOG, "Unable to load dictionary.", e);
         if (dictRaf != null) {
+            indexAdapter = null;
+            setListAdapter(null);
             try {
                 dictRaf.close();
             } catch (IOException e1) {
@@ -709,6 +712,9 @@ public class DictionaryActivity extends ActionBarActivity {
         textToSpeech.shutdown();
         textToSpeech = null;
 
+        indexAdapter = null;
+        setListAdapter(null);
+
         try {
             Log.d(LOG, "Closing RAF.");
             dictRaf.close();
@@ -1579,19 +1585,28 @@ public class DictionaryActivity extends ActionBarActivity {
         private TableLayout getView(final int position, PairEntry.Row row, ViewGroup parent,
                                     TableLayout result) {
             final Context context = parent.getContext();
+            final PairEntry entry = row.getEntry();
+            final int rowCount = entry.pairs.size();
             if (result == null) {
                 result = new TableLayout(context);
-            } else {
-                result.removeAllViews();
+                // Because we have a Button inside a ListView row:
+                // http://groups.google.com/group/android-developers/browse_thread/thread/3d96af1530a7d62a?pli=1
+                result.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
+                result.setClickable(true);
+                result.setFocusable(false);
+                result.setLongClickable(true);
+//                result.setBackgroundResource(android.R.drawable.menuitem_background);
+
+                result.setBackgroundResource(theme.normalRowBg);
+            } else if (result.getChildCount() > rowCount) {
+                result.removeViews(rowCount, result.getChildCount() - rowCount);
             }
-            final PairEntry entry = row.getEntry();
-            final int rowCount = entry.pairs.size();
 
             final TableRow.LayoutParams layoutParams = new TableRow.LayoutParams();
             layoutParams.weight = 0.5f;
             layoutParams.leftMargin = mPaddingLarge;
 
-            for (int r = 0; r < rowCount; ++r) {
+            for (int r = result.getChildCount(); r < rowCount; ++r) {
                 final TableRow tableRow = new TableRow(result.getContext());
 
                 final TextView col1 = new TextView(tableRow.getContext());
@@ -1617,19 +1632,38 @@ public class DictionaryActivity extends ActionBarActivity {
                 col1.setWidth(1);
                 col2.setWidth(1);
 
-                // Set what's in the columns.
+                col1.setTypeface(typeface);
+                col2.setTypeface(typeface);
+                col1.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSizeSp);
+                col2.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSizeSp);
+                // col2.setBackgroundResource(theme.otherLangBg);
 
+                if (index.swapPairEntries) {
+                    col2.setOnLongClickListener(textViewLongClickListenerIndex0);
+                    col1.setOnLongClickListener(textViewLongClickListenerIndex1);
+                } else {
+                    col1.setOnLongClickListener(textViewLongClickListenerIndex0);
+                    col2.setOnLongClickListener(textViewLongClickListenerIndex1);
+                }
+
+                result.addView(tableRow);
+            }
+
+            for (int r = 0; r < rowCount; ++r) {
+                final TableRow tableRow = (TableRow)result.getChildAt(r);
+                final TextView col1 = (TextView)tableRow.getChildAt(r == 0 ? 0 : 1);
+                final TextView col2 = (TextView)tableRow.getChildAt(r == 0 ? 1 : 3);
+
+                // Set what's in the columns.
                 final Pair pair = entry.pairs.get(r);
                 final String col1Text = index.swapPairEntries ? pair.lang2 : pair.lang1;
                 final String col2Text = index.swapPairEntries ? pair.lang1 : pair.lang2;
-
-                col1.setText(col1Text, TextView.BufferType.SPANNABLE);
-                col2.setText(col2Text, TextView.BufferType.SPANNABLE);
+                final Spannable col1Spannable = new SpannableString(col1Text);
+                final Spannable col2Spannable = new SpannableString(col2Text);
 
                 // Bold the token instances in col1.
                 final Set<String> toBold = toHighlight != null ? this.toHighlight : Collections
                                            .singleton(row.getTokenRow(true).getToken());
-                final Spannable col1Spannable = (Spannable) col1.getText();
                 for (final String token : toBold) {
                     int startPos = 0;
                     while ((startPos = col1Text.indexOf(token, startPos)) != -1) {
@@ -1640,35 +1674,12 @@ public class DictionaryActivity extends ActionBarActivity {
                 }
 
                 createTokenLinkSpans(col1, col1Spannable, col1Text);
-                createTokenLinkSpans(col2, (Spannable) col2.getText(), col2Text);
-
-                col1.setTypeface(typeface);
-                col2.setTypeface(typeface);
-                col1.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSizeSp);
-                col2.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSizeSp);
-                // col2.setBackgroundResource(theme.otherLangBg);
+                createTokenLinkSpans(col2, col2Spannable, col2Text);
 
-                if (index.swapPairEntries) {
-                    col2.setOnLongClickListener(textViewLongClickListenerIndex0);
-                    col1.setOnLongClickListener(textViewLongClickListenerIndex1);
-                } else {
-                    col1.setOnLongClickListener(textViewLongClickListenerIndex0);
-                    col2.setOnLongClickListener(textViewLongClickListenerIndex1);
-                }
-
-                result.addView(tableRow);
+                col1.setText(col1Spannable);
+                col2.setText(col2Spannable);
             }
 
-            // Because we have a Button inside a ListView row:
-            // http://groups.google.com/group/android-developers/browse_thread/thread/3d96af1530a7d62a?pli=1
-            result.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
-            result.setClickable(true);
-            result.setFocusable(false);
-            result.setLongClickable(true);
-//            result.setBackgroundResource(android.R.drawable.menuitem_background);
-
-            result.setBackgroundResource(theme.normalRowBg);
-
             result.setOnClickListener(new TextView.OnClickListener() {
                 @Override
                 public void onClick(View v) {
@@ -1713,8 +1724,8 @@ public class DictionaryActivity extends ActionBarActivity {
                                            : theme.tokenRowOtherBg);
 
             // Make it so we can long-click on these token rows, too:
-            textView.setText(text, BufferType.SPANNABLE);
-            createTokenLinkSpans(textView, (Spannable) textView.getText(), text);
+            final Spannable textSpannable = new SpannableString(text);
+            createTokenLinkSpans(textView, textSpannable, text);
 
             if (!htmlEntries.isEmpty()) {
                 final ClickableSpan clickableSpan = new ClickableSpan() {
@@ -1722,7 +1733,7 @@ public class DictionaryActivity extends ActionBarActivity {
                     public void onClick(View widget) {
                     }
                 };
-                ((Spannable) textView.getText()).setSpan(clickableSpan, 0, text.length(),
+                textSpannable.setSpan(clickableSpan, 0, text.length(),
                         Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                 textView.setOnClickListener(new OnClickListener() {
                     @Override
@@ -1731,6 +1742,7 @@ public class DictionaryActivity extends ActionBarActivity {
                     }
                 });
             }
+            textView.setText(textSpannable);
             return textView;
         }
 
@@ -1760,7 +1772,7 @@ public class DictionaryActivity extends ActionBarActivity {
         textView.setMovementMethod(LinkMovementMethod.getInstance());
         final Matcher matcher = CHAR_DASH.matcher(text);
         while (matcher.find()) {
-            spannable.setSpan(new NonLinkClickableSpan(textColorFg), matcher.start(),
+            spannable.setSpan(new NonLinkClickableSpan(), matcher.start(),
                               matcher.end(),
                               Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
         }