从其他类创建对象

Posted

技术标签:

【中文标题】从其他类创建对象【英文标题】:Creating Object from other class 【发布时间】:2017-04-22 13:24:03 【问题描述】:

我有一个设置屏幕,您可以在其中选择、添加和删除应用的配置。

添加配置时,我创建一个 inputBox 类的新实例(扩展设置活动类 - 我存储标准 android 文本输入框的过程)以查询新配置的名称。

在此输入框的 Onclick 中,调用来自超类(设置活动)的过程以创建新的配置对象。 这个过程从活动中查询一些东西(例如选择的微调器元素),包括seekBar的进度。

这是我获得 NPE 的地方:

java.lang.NullPointerException: Attempt to invoke virtual method'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference

在应用初始化时也会调用相同的对象创建过程,并且工作正常。

我从错误中了解到,问题是当从子类调用过程时,不再设置变量对屏幕相应元素的引用 - 因此无法查询。

所以问题: 当从另一个类调用过程时,如何查询活动元素的值?

我知道这个话题很广泛,但我现在几天都想不通 提前感谢您的帮助。

这是一个问题的方案:

public class Settings extends AppCompatActivity
Context settingsContext = this;
private Spinner someSpinner;
//other elements
@Override
protected void onCreate(final Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    someSpinner = (Spinner) findViewById(R.id.someView);
    //other elements
    addNewConfig.setOnClickListener((v) --> 
        inputBox inputBox = new inputBox("OK", "Cancel", settingsContext, "sourcePath",1,1);
        newConfigName = inputBox.show();
    );

public sSetting makeNewConfig(String name, String sourcePath, int dataFrom, int dataTo)
    sSetting newConfig;
    newConfig = new sSetting("NAME", someSpinner.getProgress()>0, ...);
    return newConfig;


还有输入框:

 public final class inputBox extends Settings 
 //someVars
 inputBox(String buttonOk, String buttonCancel, Context setContext, String sourcePath, int dataFrom, int dataTo)
     //variable setters
 
 private String show() 
      //show msgbox
      //onclick ok
      super.makeNewConfig(....);
 

【问题讨论】:

一个配置元素只包含数据,但我必须从设置屏幕查询数据(例如关闭/打开音乐搜索栏:我在配置对象中保存true或false)跨度> Settings extends AppCompatActivity , inputBox extends Settings , new inputBox(...) ... 你不应该这样做 ...阅读一些官方指南,尝试了解如何使用 Activity和其他安卓组件... 允许的活动状态是什么? 我在自定义 appBars 的官方指南中发现 Settings extends AppCompatActivity。 错误的部分是new inputBox(...) ...extends 部分只说明了原因(因为您不应该在从 Activity 派生的类上调用 new 运算符) 【参考方案1】:

为了解决这个问题,我稍微重组了我的项目: 我删除了 inputBox-Part,经过一些研究,我认为它对于我需要的东西来说太复杂了。 但是:我现在在我的设置视图中添加了一个 editText。 尽管为此我不得不更改我的设置视图,但它现在看起来更好,并且为用户编辑配置名称非常容易。

我认为在大多数情况下都可以解决问题。添加 Popup-Boxes 只是需要更多的错误处理,并使设计更加复杂

我希望这会有所帮助;) 如果您需要它的代码,可以在此处获得: GitHub - AIM

【讨论】:

以上是关于从其他类创建对象的主要内容,如果未能解决你的问题,请参考以下文章

对象的创建

Template methed

匿名对象与内部类

singleton(单件)-对象创建型模式

如何从现有的基类对象创建派生类对象?

如何创建一个包含另一个类的对象数组的类,如何操作其他类的私有属性