程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了无法从 Kotlin 类中的 Java 类调用公共函数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决无法从 Kotlin 类中的 Java 类调用公共函数?

开发过程中遇到无法从 Kotlin 类中的 Java 类调用公共函数的问题如何解决?下面主要结合日常开发的经验,给出你关于无法从 Kotlin 类中的 Java 类调用公共函数的解决方法建议,希望对你解决无法从 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,请注明来意。