首页 > 解决方案 > 在一段时间后将变量声明为常量-解决方法是什么

问题描述

情况编码如下:

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;


import android.os.Bundle;

import com.makeIT.www.R;

public class MainScreenActivity extends AppCompatActivity {
    /*final*/static Toolbar app_toolbar = null; //would like to declare constant here but,

    private Toolbar return_toolbar(){

        return findViewById(R.id.app_toolbar);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activityscreen_main);
        app_toolbar = findViewById(R.id.app_toolbar);/*findViewById isn't available till here*/

所以,我想制作 view static final,但正如您所见findViewById,在设置布局之前不可用。因此,我只能做到static。(在这种情况下,不做 final 不会有什么坏处,但如果有解决方法,我还是想知道。)

编辑:我想在这里做的是让 app_toolbar 可用作静态(即没有任何实例关联),但也可用作常量,但你会看到两者都发生 app_toobar 应该在类中定义,而不是在其中一种方法中。一种方法是手动调用onCreate(如果可能的话),但Bundle我们也无法使用。有可能吗overloadingonCreate如果是,我们如何获取,Bundle因为我们可能想保存状态

标签: javaandroid

解决方案


不确定这是您所追求的,所以我将陈述以下假设:您想要的是能够将工具栏作为静态变量访问,而不管它所属的活动的状态如何。

我要做的是创建一个工厂类,其目的是创建工具栏。但是,这将需要您进行以下更改:

  1. 您可以通过调用工厂获得工具栏(如果您愿意,可以是静态的)。您可以连接工厂以返回您想要的工具栏设置。

  2. 在活动中,您删除用于构建工具栏的所有代码(这需要移至 1 中解释的工厂类),然后只需从活动中调用工厂。

然而,这种方法的缺点是:

  1. 您可能需要使用一些额外的逻辑来检查组件是否已呈现。

  2. 将无法访问对象的父级(可能不会破坏交易,但有时您可能需要访问父级容器),至少不能通过工厂本身。

编辑:我已经有很长一段时间没有使用 Java(并且很久没有接触过 Android,但是......)我的意思是这样的:

public class ToolbarFactory {
    public static Toolbar getToolbar() {
        // In here you build your toolbar. You could move the existing code within your application which at the moment is building the toolbar.
    }
}

每当您想获得工具栏时,您都可以这样做:ToolbarFactory.getToolbar()这将为您提供所需的工具栏。

然后,在您的活动中,我假设您有类似的东西(下面的伪代码):

Toolbar t = new Toolbar();
t.setThis(this);
s.setThat(that);
someContainer.add(t);

上面的块需要移动到工厂类并替换为以下内容:

someContainer.add(ToolbarFactory.getToolbar());

推荐阅读