ClassCastException при приведении пользовательского представления подкласса - PullRequest
2 голосов
/ 23 мая 2010

Я столкнулся с ранней проблемой разработки для Android. Я сделал свой собственный вид (который хорошо работает). Вначале я просто добавил его в макет программным способом, но решил, что вместо этого можно попробовать поместить его в макет XML (для согласованности).

Итак, что я получил, это:

main.xml:

[...]
<sailmeter.gui.CompassView
android:id="@+id/compassview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/widget55"
android:background="@color/white"
/>
[...]

CompassView.java:

public class CompassView extends View { 
protected void onDraw(Canvas canvas) { [...] }
public void setBearing(float bearing) { [...] }
}

SailMeter.java (класс активности):

public class SailMeter extends Activity implements PropertyChangeListener {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
compassview = (CompassView) findViewById(R.id.compassview1); //Line 51 in SailmMeter.java
[...]
}
}

(Очевидно, больше, но вы поняли)

Теперь это трассировка стека:

05-23 16:32:01.991: ERROR/AndroidRuntime(10742): Uncaught handler: thread main exiting due to uncaught exception  
05-23 16:32:02.051: ERROR/AndroidRuntime(10742): java.lang.RuntimeException: Unable to start activity ComponentInfo{sailmeter.gui/sailmeter.gui.SailMeter}:   java.lang.ClassCastException: android.view.View
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.os.Looper.loop(Looper.java:123)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread.main(ActivityThread.java:4595)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at java.lang.reflect.Method.invokeNative(Native Method)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at java.lang.reflect.Method.invoke(Method.java:521)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at dalvik.system.NativeStart.main(Native Method)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742): Caused by: java.lang.ClassCastException: android.view.View
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at sailmeter.gui.SailMeter.onCreate(SailMeter.java:51)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-23 16:32:02.051: ERROR/AndroidRuntime(10742):     ... 11 more

Почему я не могу разыграть свой собственный вид? Мне нужно, чтобы это был тот тип, так как в нем есть несколько дополнительных методов, к которым я хочу получить доступ. Должен ли я реструктурировать его и заставить другой класс обрабатывать логику, а затем просто иметь представление как представление? Я бы очень хотел, чтобы это сработало.

Спасибо за любую помощь.

Ответы [ 3 ]

1 голос
/ 23 мая 2010

Приветствует всех!

Я не знаю, что вызвало это, но я закончил тем, что закрыл затмение, обновил все файлы, и затем я заметил, что xml все еще определил его как представление, а не как представление компаса.Так что я изменил это (и исправил несколько других ошибок), а затем это сработало.

Спасибо за помощь!

1 голос
/ 23 мая 2010

Я делал это раньше и счел необходимым использовать FlaoutInflater. Возможно, вы могли бы попробовать что-то вроде этого:

public CompassView( Context context, AttributeSet attributeSet ) 
{
    super( context, attributeSet );

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate( R.layout.name_of_your_compass_view_layout_file, this );
}
0 голосов
/ 27 марта 2014

Обходной путь для исправления: назначьте новое значение 'id' для CustomView в XML-формате макета и findViewById ().

Скорее всего, это ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...