大佬教程收集整理的这篇文章主要介绍了无法从 Kotlin 类中的 Java 类调用公共函数,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我有一个完整的 Java 应用程序,它使用 recyclervIEw 显示一些视频及其工作。我正在尝试将其迁移到 Kotlin 应用程序,但由于逻辑相当复杂,我决定暂时保留 Java 中的一个类。
Java 类的目的是为回收者视图显示 exo 播放器视频数据。
但是在我的主要活动中,在 Kotlin 中,我需要调用它的一个函数来加载一些数据。
最初,在java应用程序的主要活动中,我像这样初始化recyclervIEw(recyclervIEw.setMediaObjects和recyclervIEw.setAdapter是重要的部分)
private com.example.androIDchALLENgejava.VIDeoPlayerRecyclerVIEw mRecyclerVIEw;
private final OkhttpClIEnt clIEnt = new OkhttpClIEnt();
private ArrayList<MediaObject> mMediaObjects = new ArrayList<MediaObject>();
@OverrIDe
protected voID onCreate(Bundle savedInstanceStatE) {
super.onCreate(savedInstanceStatE);
setContentVIEw(R.layout.activity_main);
mRecyclerVIEw = findVIEwByID(R.ID.recycler_vIEw);
}
private voID initRecyclerVIEw(){
linearlayoutmanager layoutManager = new linearlayoutmanager(this);
mRecyclerVIEw.setLayoutManager(layoutManager);
VerticalSpacingItemDecorator itemDecorator = new VerticalSpacingItemDecorator(10);
mRecyclerVIEw.addItemdecoration(itemDecorator);
ArrayList<MediaObject> mediaObject = new ArrayList<MediaObject>(mMediaObjects);
mRecyclerVIEw.setMediaObjects(mediaObject);
com.example.androIDchALLENgejava.VIDeoPlayerRecyclerAdapter adapter = new com.example.androIDchALLENgejava.VIDeoPlayerRecyclerAdapter(mediaObject,initGlIDe());
mRecyclerVIEw.setAdapter(adapter);
}
这很有效,所以我正在尝试在我的 Kotlin 应用程序中做一些类似的事情。我的 Kotlin 应用主要活动设置如下:
(抱歉这里的点播和媒体对象是一样的)
class MainActivity : AppCompatActivity() {
overrIDe fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceStatE)
binding = ActivitymainBinding.inflate(layoutInflater)
val vIEw = binding.root
setContentVIEw(vIEw)
binding.recyclerVIEw.adapter = VIDeoPlayerAdapter(List)
binding.recyclerVIEw.setVODs()
binding.recyclerVIEw.layoutManager = linearlayoutmanager(this)
binding.recyclerVIEw.hasFixedSize()
}
}
但是 setMediaObjects 是红色的。
所以基本上,当我在 Java MainActivity 中时,我可以从 mRecyclerVIEw 访问 setMediaObjects,但是当我在 Kotlin MainActivity 中使用绑定时,该方法不可用。
下面的 Java 类在每个应用程序中都完全相同。 setVODs 一直在底部。
谁能告诉我问题所在?谢谢
public class VIDeoPlayerRecyclerVIEw extends RecyclerVIEw {
private static final String TAG = "VIDeoPlayerRecyclerVIEw";
private enum VolumeState {ON,OFF};
// ui
private ImageVIEw thumbnail,volumeControl;
private Progressbar progressbar;
private View viewHolderParent;
private FrameLayout frameLayout;
private PlayerVIEw vIDeoSurfaceVIEw;
private SimpleExoPlayer vIDeoPlayer;
// vars
private ArrayList<VOD> vods = new ArrayList<>();
privatE int vIDeoSurfaceDefaultHeight = 0;
privatE int screenDefaultHeight = 0;
private Context context;
privatE int playposition = -1;
private Boolean isVIDeoVIEwAdded;
//glIDe
private requestManager requestManager;
// controlling playBACk state
private VolumeState volumeState;
public VIDeoPlayerRecyclerVIEw(@NonNull Context context) {
super(context);
init(context);
}
public VIDeoPlayerRecyclerVIEw(@NonNull Context context,@Nullable AttributeSet attrs) {
super(context,attrs);
init(context);
}
private voID init(Context context){
this.context = context.getApplicationContext();
display display = ((WindowManager) getContext().getSystemservice(Context.WINDOW_serviCE)).getDefaultdisplay();
Point point = new Point();
display.getSize(point);
vIDeoSurfaceDefaultHeight = point.x;
screenDefaultHeight = point.y;
vIDeoSurfaceVIEw = new PlayerVIEw(this.context);
//for adding surface vIEws dynamically - in case its inserted into a vIEw it doesn't fit perfectly
vIDeoSurfaceVIEw.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_ZOOM);
BanDWIDthMeter banDWIDthMeter = new DefaultBanDWIDthMeter();
TrackSELEction.Factory vIDeoTrackSELEctionFactory =
new AdaptiveTrackSELEction.Factory(banDWIDthMeter);
TrackSELEctor trackSELEctor =
new DefaultTrackSELEctor(vIDeoTrackSELEctionFactory);
// 2. Create the exo player
vIDeoPlayer = ExoPlayerFactory.newSimpleInstance(context,trackSELEctor);
// Bind the player to the vIEw.
vIDeoSurfaceVIEw.setUseController(false);
vIDeoSurfaceVIEw.setPlayer(vIDeoPlayer);
addOnScrollListener(new OnScrollListener() {
@OverrIDe
public voID onScrollStateChanged(RecyclerVIEw recyclerVIEw,int newStatE) {
super.onScrollStateChanged(recyclerVIEw,newStatE);
//you have to make sure the recycler vIEw has stopped before taking actions
if (newState == RecyclerVIEw.SCRolL_STATE_IDLE) {
Log.d(tag,"onScrollStateChanged: called.");
if(thumbnail != null){ // show the old thumbnail
//will you need thumbnails for you app??
thumbnail.setVisibility(VISIBLE);
}
// There's a special case when the end of the List has been reached.
// Need to handle that with this bit of logic
//add a query here for more vIDeos?
if(!recyclerVIEw.canScrollVertically(1)){
playVIDeo(true);
}
else{
playVIDeo(false);
}
}
}
@OverrIDe
public voID onScrolled(RecyclerVIEw recyclerVIEw,int dx,int dy) {
super.onScrolled(recyclerVIEw,dx,dy);
}
});
addOnChildAttachStatechangelistener(new OnChildAttachStatechangelistener() {
@OverrIDe
public voID onChildVIEwAttachedToWindow(View view) {
}
@OverrIDe
public voID onChildVIEwDetachedFromWindow(View view) {
if (vIEwHolderParent != null && vIEwHolderParent.equals(vIEw)) {
resetVIDeoVIEw();
}
}
});
//controles playBACk for exo player
vIDeoPlayer.addListener(new Player.EventListener() {
@OverrIDe
public voID onTimelineChanged(Timeline timeline,@Nullable Object manifest,int reason) {
}
@OverrIDe
public voID onTracksChanged(TrackGroupArray trackGroups,TrackSELEctionArray trackSELEctions) {
}
@OverrIDe
public voID onLoadingChanged(Boolean isLoading) {
}
@OverrIDe
public voID onPlayerStateChanged(Boolean playWhenReady,int playBACkStatE) {
switch (playBACkStatE) {
case Player.STATE_BUFFERING:
Log.e(tag,"onPlayerStateChanged: Buffering vIDeo.");
if (progressbar != null) {
progressbar.setVisibility(VISIBLE);
}
break;
case Player.STATE_ENDED:
Log.d(tag,"onPlayerStateChanged: VIDeo ended.");
vIDeoPlayer.seekTo(0);
break;
case Player.STATE_IDLE:
break;
case Player.STATE_READY:
Log.e(tag,"onPlayerStateChanged: ready to play.");
if (progressbar != null) {
progressbar.setVisibility(GONE);
}
if(!isVIDeoVIEwAdded){
addVIDeoVIEw();
}
break;
default:
break;
}
}
@OverrIDe
public voID onRepeatModeChanged(int repeatModE) {
}
@OverrIDe
public voID onShuffleModeEnabledChanged(Boolean shuffleModeEnabled) {
}
@OverrIDe
public voID onPlayerError(ExoPlayBACkException error) {
}
@OverrIDe
public voID onpositiondisconTinuity(int reason) {
}
@OverrIDe
public voID onPlayBACkParametersChanged(PlayBACkParameters playBACkParameters) {
}
@OverrIDe
public voID onSeekProcessed() {
}
});
}
public voID playVIDeo(Boolean isEndOfList) {
int targetposition;
//determines which vIDeo to play given more than one List item on the screen
if(!isEndOfList){
//first and last VISIBLE List items
int startposition = ((linearlayoutmanager) getLayoutManager()).findFirstVisibleItemposition();
int endposition = ((linearlayoutmanager) getLayoutManager()).findLastVisibleItemposition();
// if there is more than 2 List-items on the screen,set the difference to be 1
if (endposition - startposition > 1) {
endposition = startposition + 1;
}
// something is wrong. return.
if (startposition < 0 || endposition < 0) {
return;
}
// if there is more than 1 List-item on the screen
if (startposition != endposition) {
int startpositionVIDeoHeight = getVisibleVIDeoSurfaceHeight(startposition);
int endpositionVIDeoHeight = getVisibleVIDeoSurfaceHeight(endposition);
//what List item we are going to play
targetposition = startpositionVIDeoHeight > endpositionVIDeoHeight ? startposition : endposition;
}
else {
//single List item
targetposition = startposition;
}
}
else{
targetposition = vods.size() - 1;
}
Log.d(tag,"playVIDeo: target position: " + targetposition);
// vIDeo is already playing so return
if (targetposition == playposition) {
return;
}
// set the position of the List-item that is to be played
playposition = targetposition;
if (vIDeoSurfaceVIEw == null) {
return;
}
// remove any old surface vIEws from prevIoUsly playing vIDeos
vIDeoSurfaceVIEw.setVisibility(INVISIBLE);
removeVIDeoVIEw(vIDeoSurfaceVIEw);
int currentposition = targetposition - ((linearlayoutmanager) getLayoutManager()).findFirstVisibleItemposition();
VIEw child = getChildAt(currentposition);
if (child == null) {
return;
}
//
// VIDeoPlayerVIEwHolder holder = (VIDeoPlayerVIEwHolder) child.getTag();
// if (holder == null) {
// playposition = -1;
// return;
// }
// thumbnail = holder.thumbnail;
// progressbar = holder.progressbar;
// volumeControl = holder.volumeControl;
// vIEwHolderParent = holder.itemVIEw;
// requestManager = holder.requestManager;
// frameLayout = holder.itemVIEw.findVIEwByID(R.ID.media_container);
vIDeoSurfaceVIEw.setPlayer(vIDeoPlayer);
Datasource.Factory datasourceFactory = new DefaultDatasourceFactory(
context,Util.getUserAgent(context,"RecyclerVIEw VIDeoPlayer"));
String mediaUrl = vods.get(targetposition).getMedia_url();
if (mediaUrl != null) {
Mediasource vIDeosource = new HlsMediasource.Factory(datasourceFactory)
.createMediasource(Uri.parse(mediaUrl));
vIDeoPlayer.prepare(vIDeosourcE);
vIDeoPlayer.setPlayWhenReady(true);
//HlsMediasource instead of ExractorMediasource above
}
}
/**
* Returns the visible region of the vIDeo surface on the screen.
* if some is cut off,it will return less than the @vIDeoSurfaceDefaultHeight
* @param playposition
* @return
*/
privatE int getVisibleVIDeoSurfaceHeight(int playposition) {
int at = playposition - ((linearlayoutmanager) getLayoutManager()).findFirstVisibleItemposition();
Log.d(tag,"getVisibleVIDeoSurfaceHeight: at: " + at);
VIEw child = getChildAt(at);
if (child == null) {
return 0;
}
int[] LOCATIOn = new int[2];
child.getLOCATIOnInWindow(LOCATIOn);
if (LOCATIOn[1] < 0) {
return LOCATIOn[1] + vIDeoSurfaceDefaultHeight;
} else {
return screenDefaultHeight - LOCATIOn[1];
}
}
private voID removeVIDeoVIEw(PlayerVIEw vIDeoVIEw) {
VIEwGroup parent = (VIEwGroup) vIDeoVIEw.getParent();
if (parent == null) {
return;
}
int index = parent.indexOfChild(vIDeoVIEw);
if (index >= 0) {
parent.removeVIEwAt(indeX);
isVIDeoVIEwAdded = false;
vIEwHolderParent.setonClickListener(null);
}
}
private voID addVIDeoVIEw(){
frameLayout.addVIEw(vIDeoSurfaceVIEw);
isVIDeoVIEwAdded = true;
vIDeoSurfaceVIEw.requestFocus();
vIDeoSurfaceVIEw.setVisibility(VISIBLE);
vIDeoSurfaceVIEw.setAlpha(1);
thumbnail.setVisibility(GONE);
}
private voID resetVIDeoVIEw(){
if(isVIDeoVIEwAdded){
removeVIDeoVIEw(vIDeoSurfaceVIEw);
playposition = -1;
vIDeoSurfaceVIEw.setVisibility(INVISIBLE);
thumbnail.setVisibility(VISIBLE);
}
}
public voID releasePlayer() {
if (vIDeoPlayer != null) {
vIDeoPlayer.release();
vIDeoPlayer = null;
}
vIEwHolderParent = null;
}
public voID setVODs(ArrayList<VOD> vods){
this.vods = vods;
}
}
这种行为可能是因为您不小心将 XML 中的视图类型声明为自定义类以外的某种类型,例如可能是普通的 RecyclerView。由于您现在正在使用视图绑定,因此您会收到编译时错误,而不是将运行时错误转换为错误类型。如果在 Java 中使用视图绑定,您会遇到与此布局相同的问题。
以上是大佬教程为你收集整理的无法从 Kotlin 类中的 Java 类调用公共函数全部内容,希望文章能够帮你解决无法从 Kotlin 类中的 Java 类调用公共函数所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。