lkf181 2022-12-15 16:57 采纳率: 86.5%
浏览 35
已结题

Android的Activty类中 findViewById查找View控件结果为null

我写了一个“自定义控件”继承于SurfaceView,在Activity中作为控件加入,已经达到显示的目的,并且觉得比较理想,
可是我在TestUIActivity.Java中 ViewUI g_viewUi = findViewById(R.id.sf_viewui); 却为空
Log.i 输出结果:
2022-12-15 16:23:45.223 19335-19335/com.example.lkftool I/lkfDEBUG: onCreate: g_inputMsg != null
2022-12-15 16:24:32.212 19396-19396/com.example.lkftool I/lkfDEBUG: onCreate: g_editTextLayout != null
2022-12-15 16:25:44.797 19462-19462/com.example.lkftool I/lkfDEBUG: onCreate: g_viewUi = null
可是如果g_viewUi 为空的话,页面上怎么会显示我 通过SurfaceView绘制的画面呢?

ublic class TestUIActivity extends AppCompatActivity implements ViewUI.onValueChangeListener {

    private ViewUI g_viewUi;
    public FrameLayout g_input_container;

    private RelativeLayout g_editTextLayout;
    private EditText g_inputMsg;
    private Boolean g_showEditText = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        windowsStyleHide();
        setContentView(R.layout.activity_test_uiactivity);
        init();
        g_viewUi = findViewById(R.id.sf_viewui);
        g_editTextLayout = (RelativeLayout)findViewById(R.id.re_inputleveer);
        g_inputMsg = (EditText) findViewById(R.id.et_inputMsg);
//        try{
//            //g_viewUi.setonValueChangeListener(this);
//        }catch(Exception e){
//            Log.i(Config.myTag, "onCreate: "+e.getMessage());
//        }
        if (g_viewUi == null){
        Log.i(Config.myTag, "onCreate: g_viewUi = null");
    }else{
        Log.i(Config.myTag, "onCreate: g_viewUi != null");
    }
}

ViewUI类:


public class ViewUI extends SurfaceView implements SurfaceHolder.Callback {
    private boolean g_isReander;//标记是否 开启线程
    RenderThread g_RenderThread;
    private onValueChangeListener g_onValueChangeListener = null;

    public ViewUI(Context context) {
      this(context,null);
    }
    public ViewUI(Context context, AttributeSet attrs) {
        this(context,attrs,0);
    }
    public ViewUI(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context);
        SurfaceHolder l_SurfaceHolder = getHolder();//获取放映机       (SurfaceView的方法,通过屏幕可以获取 放映机)
        l_SurfaceHolder.addCallback(this);//添加回调接口,这样才能在 SurfaceView中回调生命周期中的API
    }

    /**
     * brief  创建屏幕(SurfaceView)时回调该方法
     * param 无
     * retval 无
     */
    @Override
    public void surfaceCreated(@NonNull SurfaceHolder holder) {
        g_isReander = true;
        createElement();
        g_RenderThread = new RenderThread(holder, this, g_isReander);
        g_RenderThread.start();//开启绘制线程

    }

    /**
     * brief  改变屏幕(SurfaceView)时回调该方法
     * param 无
     * retval 无
     */
    @Override
    public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {

    }

    /**
     * brief  结束屏幕(SurfaceView)时回调该方法
     * param 无
     * retval 无
     */
    @Override
    public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
        g_isReander = false;//停止绘制线程
        g_RenderThread.stop();
    }

    /*创建各种精灵*/
    private void createElement() {
        Config.buttonLayout = new ArrayList<BaseModel>();
//        Lock_open l_Lock_open = new Lock_open(50, -Config.deviceHeight / 2 + 50);
        Lock_open l_Lock_open =  Lock_open.getInstance(Config.buttonPoint.x,  Config.buttonPoint.y);
        Config.buttonLayout.add(l_Lock_open);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
//        try{
//            new TestUIActivity().ShowEditText();
//        }catch(Exception e){
//            Log.i(Config.myTag, "onTouchEvent: "+e.getMessage());
//        }
        upDataText();
        if (event.getAction()   == MotionEvent.ACTION_UP){
           // Log.i(Config.myTag, "ViewUI  onTouchEvent: ");
            for (BaseModel item_model : Config.buttonLayout) {
                if (item_model instanceof TouchAble) {//如果该实例实现了TouchAble接口,则向下传递给该实例
                    if (((TouchAble) item_model).onTouch(event)) {//传递并检测一下实例的Touch事件是否相应
                        return true;
                    }
                }
            }
        }

        return true;
    }
    private void upDataText() {
        //g_etValue.setText(String.valueOf(f_number));
        if (g_onValueChangeListener !=null){
            g_onValueChangeListener.onValueChange();
        }
    }
    public void setonValueChangeListener(onValueChangeListener p_listener){
        this.g_onValueChangeListener = p_listener;

//        try{
//
//        }catch(Exception e){
//            Log.i(Config.myTag, "onCreate: "+e.getMessage());
//        }
    }
    public interface onValueChangeListener{
        void onValueChange();
    }
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月23日
    • 修改了问题 12月15日
    • 创建了问题 12月15日

    悬赏问题

    • ¥15 虚幻5 UE美术毛发渲染
    • ¥15 CVRP 图论 物流运输优化
    • ¥15 Tableau online 嵌入ppt失败
    • ¥100 支付宝网页转账系统不识别账号
    • ¥15 基于单片机的靶位控制系统
    • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
    • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
    • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
    • ¥15 手机接入宽带网线,如何释放宽带全部速度
    • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测