java - 为什么java类字段(和事件处理程序字段)不会在android对话框和自定义 View 中初始化?

标签 java android field android-custom-view android-dialog

我用java在android中制作了很多对话框,如下所示:

public class MyComponent extends LinearLayout {

   // constructors that will call InitializeComponent after inflate layout

    private View.OnClickListener PersistButton_OnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            PersistRest();
        }
    };

    private void PersistRest() {
        int selectedIndex = RestTimePicker().getValue() - 1;
        long selectedTimeSpan = predefinedDurationValues[selectedIndex];
        SecretaryManagerUtility.RegisterRestByDuration("", SecretaryManagerUtility.Me(), System.currentTimeMillis(), selectedTimeSpan);
    }

    @Override
    protected void InitializeComponents() {    
        PersistButton().setOnClickListener(PersistButton_OnClickListener);
        super.InitializeComponents();
    }


    private Button m_PersistButton;

    protected Button PersistButton(){
        if(m_PersistButton == null)
            m_PersistButton = (Button)rootView.findViewById(R.id.PersistButton);
        return m_PersistButton; 
    }
}

问题是单击按钮PersistButton后从未调用方法PersistButton_OnClickListener.onClick

但是如果我将 onClick 分配更改为下面的代码,则一切正常:

    PersistButton().setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            PersistRest();
        }
    });
为什么? 此问题仅发生在android对话框和android自定义 View 中

最佳答案

我找到了答案,但对错误的问题表示歉意。 InitializeLayout() 方法将在构造函数中调用(我使用自定义工具从 xml 生成 View 对象)

问题是java字段在调用super()构造函数之前不会初始化,然后,当调用InitializeLayout()时字段为空

关于java - 为什么java类字段(和事件处理程序字段)不会在android对话框和自定义 View 中初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45390808/

相关文章:

java - 如何用java制作表单并与数据库连接

Java Portable Tomcat 在桌面上创建目录

java - 在 Java 中绘制圆弧

php - 我应该如何获取 Drupal 7 自定义节点的特定字段中包含的值?

asp.net - 如何将值设置为来自 asp.net 的 Html 隐藏字段

java - JFace TableViewer 与 TreeViewer - 性能

java - 无法合并两个 mp3 文件

android:textColor= 不改变颜色

android - 启用proguard后的java.lang.NoSuchMethodError Org/apache/http/util/ByteArrayBuffer

c# - Lambda 参数在稍后范围内访问字段时与类字段冲突