2017-09-26 148 views
0

,同時學習科特林我嘗試創建makeSceneTransitionAnimation圖像過渡,但它並不像Java中工作,這是從適配器類我的代碼嘗試makeSceneTransitionAnimation在科特林

itemView.imageContent.setOnClickListener { 
    val i = Intent(context, ImagePreviewActivity::class.java) 
    i.putExtra("IMAGE", item.content) 
    val trans = context.getString(R.string.transition) 
    val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
      Activity(), itemView.imageContent, trans 
    ) 
    context.startActivity(i, options.toBundle()) 
} 

這是我logcat的

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.view.Window.hasFeature(int)' on a null object reference 
    at android.app.ActivityOptions.makeSceneTransitionAnimation(ActivityOptions.java:709) 
    at android.app.ActivityOptions.makeSceneTransitionAnimation(ActivityOptions.java:648) 
    at android.app.ActivityOptions.makeSceneTransitionAnimation(ActivityOptions.java:622) 
    at android.support.v4.app.ActivityOptionsCompat.makeSceneTransitionAnimation(ActivityOptionsCompat.java:172) 
    at com.docotel.binmaspublic.module.report.ReportAdapter$ViewHolder$bind$2.onClick(ReportAdapter.kt:130) 

對不起,如果你發現這是一個重複的問題

回答

0

此無關的Java VS科特林。

R.string.transition是String資源的ID,它不是實際值。
得到你需要使用的值:

context.getString(R.string.transition) 
+0

好吧我錯了,NullPointer我排隊** val選項**? – MNFS

0

在此行中:

val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
     Activity(), itemView.imageContent, trans 
) 

您正在創建一個新的Android活動實例。但是你必須通過你當前的活動(在這種情況下可能是[email protected])。

Edito:
假設itemView.imageContent是ImageView的,和item.content一個字符串。您可以在適配器中實現回調,並將OnClickListener中的代碼移動到適配器創建中。 像這樣的東西。

class MyAdapter : YourBaseAdapter(/*args*/) { 

    var onItemClickListener = { view: ImageView, content: String -> } 

    ///... 
    itemView.imageContent.setOnClickListener { 
    onItemClickListener(itemView.imageContent, item.content) 
    } 
    //... 
} //end of MyAdapter 

,並在你的適配器類的初始化設置:

myAdapter.onItemClickListener = { view, content -> 
    val i = Intent(context, ImagePreviewActivity::class.java) 
    i.putExtra("IMAGE", content) 
    val trans = context.getString(R.string.transition) 
    val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
     theReferenceOfYourActivity, view, trans 
    ) 
    context.startActivity(i, options.toBundle()) 

} 

您也可以通過您的活動的參考適配器構造函數,但我不推薦。


makeSceneTransitionAnimation DOC:

創建ActivityOptions使用交叉活動場景動畫活動之間過渡。該方法將多個共享元素的位置傳遞給啓動的Activity。 sharedElements中第一個元素的位置將用作退出過渡的中心。已啓動活動 中的關聯共享元素的位置將成爲其進入轉場的中心。

這需要在調用Activity上啓用android.view.Window.FEATURE_CONTENT_TRANSITIONS以導致退出轉換。被調用的活動中必須有相同的輸入轉換。

參數:
activity - 的活動窗口,其包含共享元素。
sharedElements - 要轉移到被調用的Activity及其相關視圖的共享元素的名稱。視圖必須各自具有唯一的共享元素名稱。

返回: 返回一個新的ActivityOptions對象,您可以使用該對象在啓動活動時將這些選項作爲選項Bundle提供。

+0

但這個動作來自適配器類,所以我不能這樣做** This @ MyActivity ** – MNFS

+0

然後你的適配器需要有一個對活動的引用。 – pdegand59

+0

看看我的編輯 – crgarridos