如何使xml对象显示在画布中绘制的对象前面



我从xml和画布上绘制的许多东西创建了一个EditText。如何使EditText位于画布上绘制的其他对象的前面?

xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
android:id="@+id/mainLayout"
android:clickable="true">
</RelativeLayout>

我在自定义的SurfaceView类上设置了这个

@Override
public void surfaceCreated(SurfaceHolder holder){
    thread = new MainThread(getHolder(), this); //Canvas is instatiated inside thread class
}
@Override
public void draw(Canvas canvas){
    //draw things
    EditText et = (EditText)findViewById(R.id.editText1);
}

主要活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Remove title
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    //Set fullscreen
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(new GamePanel(this)); //GamePanel is the custom SurfaceView class
}

edit_text.xml:

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/editText1"
    android:text="Hello World">
</EditText>

当前代码没有显示EditText对象。我不知道它是仍然在画布下,还是根本没有展出。有什么想法和解释吗?提前谢谢。

我没有看到您将EditText添加到SurfaceView的位置。因此,如果您只想添加EditText而不添加任何父级(我指的是xml中的RelativeLayout),那么您需要创建只包含EditText的xml,例如edit_text.xml:

<?xml version="1.0" encoding="utf-8"?>
<EditText
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/editText1"
    android:text="Hello World" />

然后你应该给它充气,并添加到你的GamePanel:中

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Remove title
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    //Set fullscreen
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    GamePanel gamePanel = new GamePanel(this);
    EditText editText = (EditText) getLayoutInflater().inflate(R.layout.edit_text, null);
    gamePanel.addView(editText);
    setContentView(gamePanel); //GamePanel is the custom SurfaceView class
}

编辑:

我忘记将膨胀视图投射到EditText,所以它应该看起来像EditText editText = (EditText) getLayoutInflater().inflate(R.layout.edit_text, null);

编辑2:

要解决SurfaceView没有addView方法的错误,您可以创建一个FrameLayoutRelativeLayout,并在其中添加您的SurfaceViewEditText:

    GamePanel gamePanel = new GamePanel(this);
    RelativeLayout.LayoutParams gameParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
    gamePanel.setLayoutParams(gameParams);
    RelativeLayout content = new RelativeLayout(this);
    EditText editText = (EditText) getLayoutInflater().inflate(R.layout.edit_text, null);
    content.addView(gamePanel);
    content.addView(editText);
    setContentView(content);

只需在canvas实例之后声明EditText,因此避免在SurfaceHolder.Callback的SurfaceCreated方法中初始化View,因为这将导致在调用onDraw之前总是将其所有声明的内容都放在后台;

只需试试这个

        @Override
        public void surfaceCreated(SurfaceHolder holder){
           // nice part to start all the background independiently to onDraw for example
        Canvas canvas;
    canvas.drawRGB(255,255,255);
    // you will see that a white background will be drawed before all what you can put in onDraw class
    }
    @Override
    public void draw(Canvas canvas){
        //draw things
     EditText et = (EditText)findViewById(R.id.editText1);
// here is where you can initializate the editText
    }