1

コマンドラインからAndroidプロジェクトをビルドし、ant debug install. しかし、 Android-PullToRefreshという外部プロジェクトを自分のプロジェクトにインポートした後、実行時にプロジェクトが異常になります。xml レイアウト ファイルで新しい ID を追加したり、ID を削除したりした後、コンパイルがうまくいくことがありますが、アプリの実行を開始すると、ClassCastException. それが起こったとき、私はそれを修正するために
しか使用できません。ant clean && ant debug installしかし、ホール プロジェクトの再コンパイルには 2 倍の時間がかかります。プロジェクトを 1 分以上コンパイルしたくありません。では、このエラーが再発しないようにするためのトリックを行うことはできますか?

スタックトレース:

E/AndroidRuntime(21226): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.zhangdan.preferential/com.zhangdan.preferential.RecommendActivity}: java.lang.ClassCastException: android.widget.TextView cannot be cast to com.handmark.pulltorefresh.library.PullToRefreshListView
E/AndroidRuntime(21226):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2185)
E/AndroidRuntime(21226):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210)
E/AndroidRuntime(21226):    at android.app.ActivityThread.access$600(ActivityThread.java:142)
E/AndroidRuntime(21226):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
E/AndroidRuntime(21226):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(21226):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(21226):    at android.app.ActivityThread.main(ActivityThread.java:4931)
E/AndroidRuntime(21226):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(21226):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(21226):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime(21226):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
E/AndroidRuntime(21226):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(21226): Caused by: java.lang.ClassCastException: android.widget.TextView cannot be cast to com.handmark.pulltorefresh.library.PullToRefreshListView
E/AndroidRuntime(21226):    at com.zhangdan.preferential.RecommendActivity.findViews(RecommendActivity.java:65)
E/AndroidRuntime(21226):    at com.zhangdan.preferential.RecommendActivity.onCreate(RecommendActivity.java:58)
E/AndroidRuntime(21226):    at android.app.Activity.performCreate(Activity.java:5008)
E/AndroidRuntime(21226):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
E/AndroidRuntime(21226):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2139)
E/AndroidRuntime(21226):    ... 11 more
W/ActivityManager(  380): 

RecommendActivity.java:

 64     private void findViews() { 
 65         mFakeListView = (PullToRefreshListView)findViewById(R.id.refreshable_list); 
 66         mListView = mFakeListView.getRefreshableView(); 
 67     } 

xml:

  1 <?xml version="1.0" encoding="utf-8"?>
  2 <com.handmark.pulltorefresh.library.PullToRefreshListView 
  3     xmlns:android="http://schemas.android.com/apk/res/android"
  4     xmlns:ptr="http://schemas.android.com/apk/res-auto"
  5     android:id="@+id/refreshable_list"
  6     android:layout_width="fill_parent"
  7     android:layout_height="fill_parent"
  8     android:cacheColorHint="#00000000"
  9     android:fadingEdge="none"
 10     android:listSelector="@android:color/transparent"
 11     android:divider="@null"
 12     android:paddingTop="5dip"
 13     android:paddingBottom="5dip"
 14     android:scrollbarStyle="outsideOverlay"
 15     ptr:ptrMode="both" />
4

3 に答える 3

2

プロジェクトでレイアウト ID を追加/削除するたびに、どういうわけか、ant debug installコマンドが影響を受けるすべてのコードを正しく再構築せず、別のウィジェットの ID が の正しい値の代わりに使用されるようになっているようですR.id.refreshable_list。アプリの起動時に、ターンによって ClassCastException が発生します。

ここに私の提案があります:

  • すべてのファイル/フォルダーの日付が有効であることを確認してください (将来の日付になっている可能性がありますか?)

  • ビルド ツールを最新バージョン (Android SDK、ant など) に更新します。

  • どのIDEを使用していますか? コマンドラインビルドを何らかの形で妨害する可能性のある自動ビルドが有効になっているかどうかを確認してください。

お役に立てれば!

于 2013-03-23T06:34:02.960 に答える
1

それが起こったとき、私はそれを修正するために ant clean && ant debug install しか使用できません。しかし、ホール プロジェクトの再コンパイルには 2 倍の時間がかかります。プロジェクトを 1 分以上コンパイルしたくありません。

実行ant clean debug installは、これらの操作を個別に実行するよりも段階的に高速になる場合があります。

コマンドを使用するのではなく、Ant スクリプトを変更して内のR.classファイルを削除することもできます。通常、これは妥当なサイズのプロジェクトとまともな開発マシンでは問題にならないため、今は簡単なテストを超えてこれを試していません。しかし、ジョーの答えの核心は、最後にコンパイルされたファイルが生成されるファイルと同期していないことであり、何らかの理由で、Ant の依存関係メカニズムは常にこれを検出するとは限りません。自分でファイルを削除すると( Linux などで) 、消去されたすべてのものを再構築する必要がなくなりますが、クラスを新たに再コンパイルする必要があります。そして、非常にbin/classes/cleanR.classR.javaR.classfind bin/classes -name R.class | xargs rmcleancleanR.java簡単なテストでは、ビルドされた APK が機能する限り、これは機能しているように見えます。ことわざにあるように、走行距離は異なる場合があります。

Pull-to-Refresh などの Android ライブラリ プロジェクトを使用している場合は、複数のR.classファイルが存在することに注意してください (アプリ用に 1 つ、ライブラリごとに 1 つ)。

于 2013-03-24T15:01:43.603 に答える
0

リソースのエラーが表示されないことがあります。xml にエラーがないことを確認してください。(com.handmark.pullrefresh.library.PullToRefreshListView は正しいパッケージですか?)

あなたが試すことができた後

1) R クラスを削除します。2) プロジェクトを消去します。3) プロジェクトのプロパティを修正します。4) 再構築します。

于 2013-03-26T15:43:09.723 に答える