Android Studio-将外部类中的方法与视图一起使用

杰伊·卡斯特(Jay Castell)

我在从另一个类调用的方法中获取视图以正常运行时遇到了一些困难。

我的应用程序包含一个主要活动(称为“覆盖”)中的体验栏,该体验栏使用进度条跟踪用户的进度。我想做的是在另一个类中有一个单独的方法来处理与体验栏相关的任何代码。

我已经为该类创建了一个实例,并且该方法已正确调用,但是某些与android / view相关的片段会导致麻烦。System.out.println将在调试器中显示文本,但是不会使用Toast和其他视图。这是两个类文件和相关的错误。


public class OverlayActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

NavigationView navigationView = null;
Toolbar toolbar = null;
int level = 0;
int addXP = 110;
ProgressBar experienceBar;
Button buttonXP;
TextView experienceLevel;
ExperienceManager exp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_overlay);

    //Set the Overlay Fragment

    OverlayFragment fragment = new OverlayFragment();
    android.support.v4.app.FragmentTransaction fragmentTransaction =
            getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fragment);
    fragmentTransaction.commit();

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Hay! Don't touch me!", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    experienceBar = (ProgressBar) findViewById(R.id.experienceBar);
    experienceBar.setProgress(12);

    experienceLevel = (TextView) findViewById(R.id.ds_appBar_level);

    buttonXP = (Button) findViewById(R.id.buttonXP);
    buttonXP.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View View) {
            exp = new ExperienceManager();
            exp.addExperience(level, addXP);
        }
    });
}

public class ExperienceManager extends AppCompatActivity {

ProgressBar experienceBar;

public int addExperience(int level, int addXP) {
    experienceBar = (ProgressBar) findViewById(R.id.experienceBar);

    int addLevel = 0;
    while (addXP >= experienceBar.getMax()) {
        addXP -= experienceBar.getMax();
        addLevel += 1;
    }
    if (addXP >= experienceBar.getMax()-experienceBar.getProgress()) {

        experienceBar.setProgress(experienceBar.getProgress() + addXP - experienceBar.getMax());
        addLevel += 1;
    } else {
        experienceBar.setProgress(experienceBar.getProgress() + addXP);
    }
    if (addLevel >= 1) {
        level += addLevel;
        Toast toast = Toast.makeText(getBaseContext(), "Level up!", Toast.LENGTH_SHORT);
        toast.show();
        //experienceLevel.setText("Level " + level);
    }
    return level;
}

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.teamcirelios.deepstone, PID: 4138
              java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window$Callback android.view.Window.getCallback()' on a null object reference
                  at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:116)
                  at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:147)
                  at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:27)
                  at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:50)
                  at android.support.v7.app.AppCompatDelegateImplV23.<init>(AppCompatDelegateImplV23.java:29)
                  at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:199)
                  at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:181)
                  at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:521)
                  at android.support.v7.app.AppCompatActivity.findViewById(AppCompatActivity.java:190)
                  at com.teamcirelios.deepstone.ExperienceManager.addExperience(ExperienceManager.java:15)
                  at com.teamcirelios.deepstone.OverlayActivity$2.onClick(OverlayActivity.java:77)
                  at android.view.View.performClick(View.java:5697)
                  at android.widget.TextView.performClick(TextView.java:10826)
                  at android.view.View$PerformClick.run(View.java:22526)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:158)
                  at android.app.ActivityThread.main(ActivityThread.java:7225)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

同样,尝试在片段中注册按钮单击时,也会产生类似的错误。体验栏本身以叠加活动显示,但是要使应用程序按预期工作,它需要从片段中的按钮(或更准确地说是复选框)接收输入以调用该类。

我能看到的唯一解决方案是采用experienceBar.getMax()和类似的东西,并将它们作为参数包括在内。但是,我需要同时返回级别和当前xp,据我所知这是不可能的。

总的来说,我有三个主要问题。

  • 此错误的非技术解释是什么?
  • 修复代码以实现所需功能的最佳(相对简单)方法是什么?
  • 如何在片段中注册事件?

谢谢!

阿迪蒂亚·乌帕迪亚

首先,您的实用程序类(即体验管理器)不应扩展AppCompatActivity ...您的实用程序类不是活动!PS,您无法在Experience Manager中找到ViewById和progressBar,因为该ProgressBar不是ExperienceManager活动的一部分,而是OverlayActivity的一部分。

如果您希望创建一个静态实用程序方法来增加经验并对其进行管理,则应以这种方式编写代码。

public class ExperienceManager{

public static int addExperience(ProgressBar experienceBar, int level, int addXP){

    int addLevel = 0;
    while (addXP >= experienceBar.getMax()) {
        addXP -= experienceBar.getMax();
        addLevel += 1;
    }
    if (addXP >= experienceBar.getMax()-experienceBar.getProgress()) {

        experienceBar.setProgress(experienceBar.getProgress() + addXP - experienceBar.getMax());
        addLevel += 1;
    } else {
        experienceBar.setProgress(experienceBar.getProgress() + addXP);
    }
    if (addLevel >= 1) {
        level += addLevel;
        Toast toast = Toast.makeText(getBaseContext(), "Level up!", Toast.LENGTH_SHORT);
        toast.show();
        //experienceLevel.setText("Level " + level);
    }
    return level;
}
}

您可以通过以下方式调用此方法:

buttonXP.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View View) {
            // Calling the static utility method over here...
            ExperienceManager.addExperience(experienceBar, level, addXP);

        }
});

那就是你需要做的:)

我建议您在尝试Android之前先熟悉Java设计模式和最佳编程实践。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android Studio与模块一起使用

来自分类Dev

Android Studio中的findViewByID无法与EditText一起使用

来自分类Dev

将IntelliJ与Android插件一起使用,而不是使用Android Studio

来自分类Dev

无法将YouTube视频与Android Studio一起播放

来自分类Dev

图像未在 android studio 中与 Picasso 一起显示

来自分类Dev

Powermockito可以与Android Studio 1.2一起使用吗

来自分类Dev

git如何与项目一起使用(Android Studio)

来自分类Dev

Android Studio-将Gradle与文件的``传统''顺序一起使用

来自分类Dev

将ProGuard / Dexguard与多个Android Studio模块一起使用

来自分类Dev

将Android Studio与AndEngineTMXTileExtension一起使用时出现TMXLoader错误

来自分类Dev

Butterknife 8.1.0不能与Android Studio 2.1.2中的JDK 1.8一起使用

来自分类Dev

Butterknife 8.1.0不能与Android Studio 2.1.2中的JDK 1.8一起使用

来自分类Dev

Android Studio外部库

来自分类Dev

Android Studio 列表视图

来自分类Dev

如何与Intellij一起安装android SDK,以匹配在Android Studio中完成的操作?

来自分类Dev

Android Studio,浏览方法

来自分类Dev

Android Studio中的ListFragment

来自分类Dev

Android Studio中的FindViewById

来自分类Dev

Android Studio中的SharedPreferences

来自分类Dev

让Android Studio中的动画

来自分类Dev

Android Studio中的错误

来自分类Dev

Android Studio中的OSMDroid

来自分类Dev

Android Studio中的Selendroid

来自分类Dev

Android Studio中的通知

来自分类Dev

在android studio中从右到左

来自分类Dev

使用Intents Android Studio

来自分类Dev

无法使YouTube视频与Android Studio一起播放

来自分类Dev

如何在Android Studio中复制应用程序以与其他资源一起使用?

来自分类Dev

工具栏未与导航抽屉一起显示。不在 android studio 或设备中

Related 相关文章

  1. 1

    Android Studio与模块一起使用

  2. 2

    Android Studio中的findViewByID无法与EditText一起使用

  3. 3

    将IntelliJ与Android插件一起使用,而不是使用Android Studio

  4. 4

    无法将YouTube视频与Android Studio一起播放

  5. 5

    图像未在 android studio 中与 Picasso 一起显示

  6. 6

    Powermockito可以与Android Studio 1.2一起使用吗

  7. 7

    git如何与项目一起使用(Android Studio)

  8. 8

    Android Studio-将Gradle与文件的``传统''顺序一起使用

  9. 9

    将ProGuard / Dexguard与多个Android Studio模块一起使用

  10. 10

    将Android Studio与AndEngineTMXTileExtension一起使用时出现TMXLoader错误

  11. 11

    Butterknife 8.1.0不能与Android Studio 2.1.2中的JDK 1.8一起使用

  12. 12

    Butterknife 8.1.0不能与Android Studio 2.1.2中的JDK 1.8一起使用

  13. 13

    Android Studio外部库

  14. 14

    Android Studio 列表视图

  15. 15

    如何与Intellij一起安装android SDK,以匹配在Android Studio中完成的操作?

  16. 16

    Android Studio,浏览方法

  17. 17

    Android Studio中的ListFragment

  18. 18

    Android Studio中的FindViewById

  19. 19

    Android Studio中的SharedPreferences

  20. 20

    让Android Studio中的动画

  21. 21

    Android Studio中的错误

  22. 22

    Android Studio中的OSMDroid

  23. 23

    Android Studio中的Selendroid

  24. 24

    Android Studio中的通知

  25. 25

    在android studio中从右到左

  26. 26

    使用Intents Android Studio

  27. 27

    无法使YouTube视频与Android Studio一起播放

  28. 28

    如何在Android Studio中复制应用程序以与其他资源一起使用?

  29. 29

    工具栏未与导航抽屉一起显示。不在 android studio 或设备中

热门标签

归档