【问题标题】:Java - Opening a new View from a seperate classJava - 从单独的类打开新视图
【发布时间】:2014-06-04 01:33:44
【问题描述】:

现在我的 MainActivity.java 扩展了 Activity 类。

package com.divergent.tapdown1;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   View PlayScreen = new PlayScreen(this);
   setContentView(PlayScreen);
   PlayScreen.setBackgroundColor(Color.BLACK);
}
}

这会打开扩展 View 的 PlayScreen。 当某个事件发生时,我希望能够打开我从 PlayScreen 创建的新 LoseScreen。问题是 setContentView() 显然是 Activity 类的一部分。我该如何解决这个问题?

谢谢!

编辑:

        if (playerBounds.bottom > rowBlock.top && playerBounds.top < rowBlock.bottom && (playerBounds.left < blockX1[row] || playerBounds.right > blockX2[row])) {

            ViewGroup parent = (ViewGroup) getParent();
            finalScore = score;

            parent.addView(new PauseScreen(getContext()));
            parent.bringToFront();
            parent.setBackgroundResource(R.drawable.pausebackground);

        }

【问题讨论】:

  • 为什么不使用 xml 并更新其视图。

标签: java android view android-activity


【解决方案1】:

您可以采取多种方法:

  • 您可以创建一个容器视图(例如FrameLayout),将其用作您的根视图,然后将 LoseScreen 添加到其中并从中删除 PlayScreen。如果其他代码需要添加/删除视图,您可以传递对容器的引用。

    View playScreen = new PlayScreen(this);
    View container = new FrameLayout(this);
    
    playScreen.setRootView(container);
    
    container.addView(playScreen);
    setContentView(container);
    


  • 您可以将MainActivity 的引用传递给创建LoseScreen 的类。由于setContentView 是一个公共方法,因此您可以直接调用setContentView,例如:

    Activity mainActivity = this;
    playScreen.setMainActivity(mainActivity);
    

    然后从PlayScreen内部:

    mainActivity.setContentView(new LoseScreen(getContext()));
    


  • PlayScreen 中,您可以使用getParent() 获取父视图,然后与第一种方法类似,将 LoseScreen 添加到其中并删除 PlayScreen。

    ViewGroup parent = (ViewGroup)getParent();
    parent.addView(new LoseScreen(getContext()));
    parent.removeView(this);
    

【讨论】:

  • 谢谢 :D 这行得通,如果我想说只是在我的播放屏幕上绘制另一个屏幕,这样我的游戏仍在显示(例如暂停屏幕),我该怎么做?
  • 创建另一个不填满屏幕的视图,例如设置为特定值或 wrap_content 的宽度/高度,并使用 addView 添加它
  • 我可以创建视图,但它不会在我的游戏视图上绘制半透明背景
  • 如果视图被其他东西覆盖,请尝试在其上调用bringToFront。如果您想要半透明背景,请尝试使用 8 位 argb 值作为背景颜色,例如#80ff0000 为 50% 透明红色。如果问题是它填满了整个屏幕,请尝试减小宽度/高度
  • 我试过调用 bringToFront 函数,但没有解决。我已经更新了我的代码以显示我正在尝试执行此操作的位置。
猜你喜欢
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
相关资源
最近更新 更多