2015-06-23 6 views
1

Я продолжаю получать ошибку, которая приводит к сбою моей программы.не имеет конструктора по умолчанию

«com.example.AutoResizeTextClock.AutoResizeTextClock не имеет конструктора по умолчанию» не

я предполагаю, что это андроид: имя в моем AndroidManifest.xml, но я не знаю, в чем проблема. Любая помощь будет оценена!

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.android.AutoResizeTextClock" > 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".AutoResizeTextClock" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

activity_auto_resize_text_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:padding="32dp" 
android:background="#ff000000"> 

<com.example.android.clocktest.AutoResizeTextClock 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:ellipsize="none" 
    android:gravity="center" 
    android:maxLines="1" 
    android:text="Auto Resized Text, max 1 line" 
    android:textSize="500sp" 
    android:textColor="#fff44336" 
    android:textFont="" 
    /> <!-- maximum size --> 


</LinearLayout> 

AutoResizeTextClock.java

package com.example.android.clocktest; 
import android.annotation.TargetApi; 
import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.RectF; 
import android.os.Build; 
import android.text.Layout.Alignment; 
import android.text.StaticLayout; 
import android.text.TextPaint; 
import android.util.AttributeSet; 
import android.util.SparseIntArray; 
import android.util.TypedValue; 
import android.widget.TextClock; 


public class AutoResizeTextClock extends TextClock { 
    private interface SizeTester { 
     /** 
     * 
     * @param suggestedSize 
     *   Size of text to be tested 
     * @param availableSpace 
     *   available space in which text must fit 
     * @return an integer < 0 if after applying {@code suggestedSize} to 
     *   text, it takes less space than {@code availableSpace}, > 0 
     *   otherwise 
     */ 
     public int onTestSize(int suggestedSize, RectF availableSpace); 
    } 

    private RectF mTextRect = new RectF(); 

    private RectF mAvailableSpaceRect; 

    private SparseIntArray mTextCachedSizes; 

    private TextPaint mPaint; 

    private float mMaxTextSize; 

    private float mSpacingMult = 1.0f; 

    private float mSpacingAdd = 0.0f; 

    private float mMinTextSize = 20; 

    private int mWidthLimit; 

    private static final int NO_LINE_LIMIT = -1; 
    private int mMaxLines; 

    private boolean mEnableSizeCache = true; 
    private boolean mInitiallized; 

    public AutoResizeTextClock(Context context) { 
     super(context); 
     initialize(); 
    } 

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

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

    private void initialize() { 
     mPaint = new TextPaint(getPaint()); 
     mMaxTextSize = getTextSize(); 
     mAvailableSpaceRect = new RectF(); 
     mTextCachedSizes = new SparseIntArray(); 
     if (mMaxLines == 0) { 
      // no value was assigned during construction 
      mMaxLines = NO_LINE_LIMIT; 
     } 
     mInitiallized = true; 
    } 

    @Override 
    public void setText(final CharSequence text, BufferType type) { 
     super.setText(text, type); 
     adjustTextSize(text.toString()); 
    } 

    @Override 
    public void setTextSize(float size) { 
     mMaxTextSize = size; 
     mTextCachedSizes.clear(); 
     adjustTextSize(getText().toString()); 
    } 

    @Override 
    public void setMaxLines(int maxlines) { 
     super.setMaxLines(maxlines); 
     mMaxLines = maxlines; 
     reAdjust(); 
    } 

    public int getMaxLines() { 
     return mMaxLines; 
    } 

    @Override 
    public void setSingleLine() { 
     super.setSingleLine(); 
     mMaxLines = 1; 
     reAdjust(); 
    } 

    @Override 
    public void setSingleLine(boolean singleLine) { 
     super.setSingleLine(singleLine); 
     if (singleLine) { 
      mMaxLines = 1; 
     } else { 
      mMaxLines = NO_LINE_LIMIT; 
     } 
     reAdjust(); 
    } 

    @Override 
    public void setLines(int lines) { 
     super.setLines(lines); 
     mMaxLines = lines; 
     reAdjust(); 
    } 

    @Override 
    public void setTextSize(int unit, float size) { 
     Context c = getContext(); 
     Resources r; 

     if (c == null) 
      r = Resources.getSystem(); 
     else 
      r = c.getResources(); 
     mMaxTextSize = TypedValue.applyDimension(unit, size, 
       r.getDisplayMetrics()); 
     mTextCachedSizes.clear(); 
     adjustTextSize(getText().toString()); 
    } 

    @Override 
    public void setLineSpacing(float add, float mult) { 
     super.setLineSpacing(add, mult); 
     mSpacingMult = mult; 
     mSpacingAdd = add; 
    } 

    /** 
    * Set the lower text size limit and invalidate the view 
    * 
    * @param minTextSize 
    */ 
    public void setMinTextSize(float minTextSize) { 
     mMinTextSize = minTextSize; 
     reAdjust(); 
    } 

    private void reAdjust() { 
     adjustTextSize(getText().toString()); 
    } 

    private void adjustTextSize(String string) { 
     if (!mInitiallized) { 
      return; 
     } 
     int startSize = (int) mMinTextSize; 
     int heightLimit = getMeasuredHeight() - getCompoundPaddingBottom() 
       - getCompoundPaddingTop(); 
     mWidthLimit = getMeasuredWidth() - getCompoundPaddingLeft() 
       - getCompoundPaddingRight(); 
     mAvailableSpaceRect.right = mWidthLimit; 
     mAvailableSpaceRect.bottom = heightLimit; 
     super.setTextSize(
       TypedValue.COMPLEX_UNIT_PX, 
       efficientTextSizeSearch(startSize, (int) mMaxTextSize, 
         mSizeTester, mAvailableSpaceRect)); 
    } 

    private final SizeTester mSizeTester = new SizeTester() { 
     @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
     @Override 
     public int onTestSize(int suggestedSize, RectF availableSPace) { 
      mPaint.setTextSize(suggestedSize); 
      String text = getText().toString(); 
      boolean singleline = getMaxLines() == 1; 
      if (singleline) { 
       mTextRect.bottom = mPaint.getFontSpacing(); 
       mTextRect.right = mPaint.measureText(text); 
      } else { 
       StaticLayout layout = new StaticLayout(text, mPaint, 
         mWidthLimit, Alignment.ALIGN_NORMAL, mSpacingMult, 
         mSpacingAdd, true); 
       // return early if we have more lines 
       if (getMaxLines() != NO_LINE_LIMIT 
         && layout.getLineCount() > getMaxLines()) { 
        return 1; 
       } 
       mTextRect.bottom = layout.getHeight(); 
       int maxWidth = -1; 
       for (int i = 0; i < layout.getLineCount(); i++) { 
        if (maxWidth < layout.getLineWidth(i)) { 
         maxWidth = (int) layout.getLineWidth(i); 
        } 
       } 
       mTextRect.right = maxWidth; 
      } 

      mTextRect.offsetTo(0, 0); 
      if (availableSPace.contains(mTextRect)) { 
       // may be too small, don't worry we will find the best match 
       return -1; 
      } else { 
       // too big 
       return 1; 
      } 
     } 
    }; 

    /** 
    * Enables or disables size caching, enabling it will improve performance 
    * where you are animating a value inside TextView. This stores the font 
    * size against getText().length() Be careful though while enabling it as 0 
    * takes more space than 1 on some fonts and so on. 
    * 
    * @param enable 
    *   enable font size caching 
    */ 
    public void enableSizeCache(boolean enable) { 
     mEnableSizeCache = enable; 
     mTextCachedSizes.clear(); 
     adjustTextSize(getText().toString()); 
    } 

    private int efficientTextSizeSearch(int start, int end, 
             SizeTester sizeTester, RectF availableSpace) { 
     if (!mEnableSizeCache) { 
      return binarySearch(start, end, sizeTester, availableSpace); 
     } 
     String text = getText().toString(); 
     int key = text == null ? 0 : text.length(); 
     int size = mTextCachedSizes.get(key); 
     if (size != 0) { 
      return size; 
     } 
     size = binarySearch(start, end, sizeTester, availableSpace); 
     mTextCachedSizes.put(key, size); 
     return size; 
    } 

    private static int binarySearch(int start, int end, SizeTester sizeTester, 
            RectF availableSpace) { 
     int lastBest = start; 
     int lo = start; 
     int hi = end - 1; 
     int mid = 0; 
     while (lo <= hi) { 
      mid = (lo + hi) >>> 1; 
      int midValCmp = sizeTester.onTestSize(mid, availableSpace); 
      if (midValCmp < 0) { 
       lastBest = lo; 
       lo = mid + 1; 
      } else if (midValCmp > 0) { 
       hi = mid - 1; 
       lastBest = hi; 
      } else { 
       return mid; 
      } 
     } 
     // make sure to return last best 
     // this is what should always be returned 
     return lastBest; 

    } 

    @Override 
    protected void onTextChanged(final CharSequence text, final int start, 
           final int before, final int after) { 
     super.onTextChanged(text, start, before, after); 
     reAdjust(); 
    } 

    @Override 
    protected void onSizeChanged(int width, int height, int oldwidth, 
           int oldheight) { 
     mTextCachedSizes.clear(); 
     super.onSizeChanged(width, height, oldwidth, oldheight); 
     if (width != oldwidth || height != oldheight) { 
      reAdjust(); 
     } 
    } 
} 
+0

Просто добавьте пустой конструктор. –

+1

@GabeSechan справедливо указал, что у вас серьезные проблемы с вашим кодом. 'AutoResizeTextClock' не является' Activity' или его подклассом, но вы все еще добавляете его в свой манифест в тег ''. – Sufian

ответ

0

Создать конструктор по умолчанию для класса, который не принимает никаких параметров.

public AutoResizeTextClock() { 

} 
+2

Хотя вы не ошибаетесь, если вы посмотрите на его код, у него есть серьезные проблемы помимо этого. Этого недостаточно, чтобы исправить ситуацию. –

0

Default Constructors:

Конструктор по умолчанию конструктор, который либо не имеет параметров, или если он имеет параметры, все параметры имеют значения по умолчанию. Если нет никакого конструктора, определенного пользователем для класса A, и один необходим, компилятор неявно объявляет конструктор A :: A(). Этот конструктор является встроенным публичным членом своего класса.

Так просто добавить:

public AutoResizeTextClock() { 

} 
+0

Это не сработало. Я думаю, что есть нечто большее, чем просто. – Jon

0

В дополнение к вышеуказанным двум комментариям:

Не забудьте инициализировать свой контекст, AttributeSet и defStyle со значениями по умолчанию или базового класса не будет установка должным образом.

+2

Он не может. Его проблема заключается в том, что он вводит в заблуждение действия и взгляды. Взгляд, завышенный от xml, правильно установит его параметры. У Activity нет его (фактически, Activity - это контекст). –

+0

Ах. Благодаря! Это вообще хорошая практика, но я считаю, что я пропустил, что это приложение для Android. Это должно быть поздно :) –

+0

@GabeSechan Вы правы. Я явно смущаю деятельность и взгляды. Похоже, у меня все еще есть способ узнать, прежде чем я смогу продолжить. – Jon

5

Ваш код немного смущен. В манифесте xml вы называете это Activity, но ваш Java-код предназначен для представления. Это две разные вещи. Действие должно выполняться из Activity (или его подкласса) и должно иметь конструктор по умолчанию - обычно он не имеет конструкторов и позволяет компилятору генерировать по умолчанию. В представлении должен быть один из 3-х конструкторов (по крайней мере) и, как правило, имеет тот, который принимает контекст и набор атрибутов. Это и есть ваш код. Вам нужно создать реальную активность и поместить этот вид в макет для отображения.

+0

Я считаю, что ты прав. Я изменил другой код, который я нашел.Однако мое понимание андроида все еще очень ограничено, и я делаю ошибки. Мне нужно будет узнать больше о действиях, прежде чем я начну. – Jon

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