当前位置:编程学习 > wap >>

一个Activity中的多个View怎么切换啊?

最近学习游戏开发,简单的一个小游戏,首先是欢迎界面,然后是选择界面,在同一个Activity中,怎么由当前初始的View切换到自己想要的View呢?不是XML文件,自己编写View,贴图之类的。

感觉用多个Activity有点费事,一个activity对应一个View有点笨啊,对参数的传递肯定有麻烦。
请牛人指教,提供个思路啊 --------------------编程问答-------------------- Inflater呗 --------------------编程问答-------------------- View view =new XXXView(Context);
setContentView(view); --------------------编程问答--------------------
引用楼主 licaiyuren 的回复:
最近学习游戏开发,简单的一个小游戏,首先是欢迎界面,然后是选择界面,在同一个Activity中,怎么由当前初始的View切换到自己想要的View呢?不是XML文件,自己编写View,贴图之类的。

感觉用多个Activity有点费事,一个activity对应一个View有点笨啊,对参数的传递肯定有麻烦。
请牛人指教,提供个思路啊


这是需要加载的XML文件吧? --------------------编程问答--------------------
引用 1 楼 scliu0718 的回复:
Inflater呗


这是需要加载的XML文件吧? --------------------编程问答--------------------
引用 2 楼 lg707415323 的回复:
View view =new XXXView(Context);
setContentView(view);


我不是在activity类中切换界面,我是想从当前的View中,响应 onTouchEvent()以后,直接切换到一个新的View。能否提供个思路啊,新手,多指教 --------------------编程问答-------------------- onTouchEvent()以后setContentView(view); --------------------编程问答-------------------- 自己试探着,把几个要加载的View成虚类,在Activity中再实现空方法,空方法里就是 
gameView=new GameView(this){
         public void onNextView() {
         setContentView(sG);//借助Activity实现
         Log.d("Main","main");
         }
        };

可以切换到新的View中。

不知道各位有更合理的方法么? --------------------编程问答--------------------
引用 6 楼 a328240784 的回复:
onTouchEvent()以后setContentView(view);


我override的是View的,所以在里边不可以用setContentView。。。 --------------------编程问答-------------------- 当前的View中,响应 onTouchEvent()以后的焦点  会传递给activity

activity可以判断是哪个View传递过来的焦点

然后在activity里切换页面

切换页面是activity的事不要 放在View做  --------------------编程问答-------------------- view1.setVisibility(View.GONE);
view2.setVisibility(View.VISIBLE);
view1和view2全部都是在一个xml里面配置的  通过设置显示与隐藏就能达到切换的效果 --------------------编程问答--------------------
引用 10 楼 sasuke38 的回复:
view1.setVisibility(View.GONE);
view2.setVisibility(View.VISIBLE);
view1和view2全部都是在一个xml里面配置的 通过设置显示与隐藏就能达到切换的效果

赞同 --------------------编程问答-------------------- 直接在onTouch中点击后,修改canvas的内容不就好了吗 --------------------编程问答-------------------- 自定义的View一般都传一个Activity进去,在View里面就可以activity.setContentView()了 --------------------编程问答-------------------- 这个要用到java开发语言的多态

例如:

public void onDraw(canvas c)
{
             switch(GameState)
            {
             case:DrawLogo(c);break;
             case:DrawMenu(c);break;
            }

}

public void DrawLogo(canvas c){}

public void DrawMenu(canvas c){}

用android开发游戏的话  用一个View就可以解决  只是要在View定多个状态  每个状态可以控制一个界面

这里我沿用的j2me的游戏开发经验

希望对你有帮助

--------------------编程问答-------------------- 实例化Intent(this,目的Activity类.class);
再调用activity.setContentView(刚才实例化的Intent对象)

如果有返回值的话可以下载我这个例子参考。
http://download.csdn.net/download/ikaros_android/4054046 --------------------编程问答--------------------

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class HandleMessage extends Activity implement Runnable{
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loading);
        
        Thread thread = new Thread(this);
        thread.start()
    }
    
    private Handler mHandler = new Handler(){
        public void handleMessage(Message msg){
            //main.xml is your main ui
            setContentView(R.layout.main);
        }
    }

    public void run(){
        initizlize();
        mHandler.sendEmptyMessage(0);
    }
    
    private void initizlize(){
        //init ............ 
    }
}


res/layout/loading.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView android:id="@+id/loading"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Welcom..."
/>
</LinearLayout>


--------------------编程问答-------------------- 用intent不行吗? --------------------编程问答--------------------
引用 13 楼 lg707415323 的回复:
自定义的View一般都传一个Activity进去,在View里面就可以activity.setContentView()了

+1 --------------------编程问答--------------------
引用 15 楼 ikaros_android 的回复:
实例化Intent(this,目的Activity类.class);
再调用activity.setContentView(刚才实例化的Intent对象)

如果有返回值的话可以下载我这个例子参考。
http://download.csdn.net/download/ikaros_android/4054046


是一个Activity中有多个自定义的View,我要根据当前View的操作,切换到下一个View
不是你理解的那样子 --------------------编程问答--------------------
引用 14 楼 a5864131452 的回复:
这个要用到java开发语言的多态

例如:

public void onDraw(canvas c)
{
             switch(GameState)
            {
             case:DrawLogo(c);break;
             case:DrawMenu(c);break;
            }

……


思路不错,不太熟悉Java,从C转过来的 --------------------编程问答-------------------- tablehost
或者使用Fragement --------------------编程问答-------------------- --------------------编程问答-------------------- View.setVisibility()设置显示隐藏不行吗 --------------------编程问答-------------------- 不太明白楼主要的效果。
不过可以看下calculator源码下的PanelSwitcher类,
也许可以帮助到你 --------------------编程问答--------------------
引用 23 楼 wyf35429827 的回复:
View.setVisibility()设置显示隐藏不行吗

可以把当前的View给隐藏了,但是显示不出已经自定义好的下一个View啊,我是在当前View中操作的,在新的View类中onDraw都没有调用 --------------------编程问答-------------------- 在touch的view里面传递message到activity的handler,然后handler里面进行页面切换,也就是setcontentview --------------------编程问答--------------------
引用 26 楼 xiongzhizong 的回复:
在touch的view里面传递message到activity的handler,然后handler里面进行页面切换,也就是setcontentview

恩,对头,这样子处理不错,我修改过来了。
利用Handler处理更合理一些 --------------------编程问答-------------------- View view =new XXXView(Context);
setContentView(view); --------------------编程问答-------------------- --------------------编程问答-------------------- 自定义的View一般都传一个Activity进去,在View里面就可以activity.setContentView()了 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 新来报到







signature--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
http://www.hotsalesportshoes.com/
--------------------编程问答-------------------- FrameLayout --------------------编程问答-------------------- --------------------编程问答--------------------

public class MyActivity extends Activity {
WelcomeView welcomeView;//欢迎动画界面的引用
GameView gameView;//游戏界面的引用
AboutView aboutView;//关于界面
HelpView helpView;//帮助界面
Handler myHandler = new Handler(){//用来更新UI线程中的控件
        public void handleMessage(Message msg) {
         if(msg.what == 1){//欢迎界面发送的消息
         if(welcomeView != null){
         welcomeView = null;
         }
         initGameView();
         MyActivity.this.setContentView(gameView);
         }else if(msg.what == 2){//游戏胜利或者失败时点击屏幕
         if(gameView != null){
         gameView = null;
         }
         initWelcomeView();//初始化欢迎界面
         MyActivity.this.setContentView(welcomeView);//切换到欢迎界面
         }else if(msg.what == 3){
         initAboutView();
         MyActivity.this.setContentView(aboutView);//切换到关于界面
         }else if(msg.what == 4){
         initHelpView();
         MyActivity.this.setContentView(helpView);//切换到帮助界面
         }
        }
};
自定义的View
public class AboutView extends SurfaceView implements SurfaceHolder.Callback{
KLSDActivity activity;//activity的引用
Bitmap aboutBitmap ;
SurfaceHolder surfaceHolder;//surfaceHolder的引用
public AboutView(MyActivity activity) {
super(activity);
this.activity = activity;
surfaceHolder = this.getHolder();
getHolder().addCallback(this);//添加Callback接口的实现
// aboutBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.about);
}
  public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
double x = event.getX();
double y = event.getY();
if(x>230 && x<310 && y>310 && y<450){//点击确定按钮
activity.myHandler.sendEmptyMessage(2);
}
}
return super.onTouchEvent(event);
}


这是我参考了好几种写法后,觉得比较合适的。
一个Activity,包含了多个view,可以直接从当前的view直接切换到自己想要的下一个view,也是变相的通过acticty来实现的。
--------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 新手报到,多多指导 --------------------编程问答-------------------- onTouchEvent()以后setContentView(view); --------------------编程问答--------------------
引用 40 楼 heaven13483 的回复:
onTouchEvent()以后setContentView(view);


服了 --------------------编程问答-------------------- 俺进来学习学习, 坐等高人 --------------------编程问答-------------------- 这个纯粹是代码编写技巧的问题,仁者见仁 --------------------编程问答--------------------
引用 41 楼 licaiyuren 的回复:
引用 40 楼 heaven13483 的回复:

onTouchEvent()以后setContentView(view);


服了


其实他是想说ontouch写在Activity里面,直接在activity里面处理~~如果你不需要监控游戏状态的话,根本不需要handler,不过看这段代码貌似只是根据菜单跳转而已。
--------------------编程问答-------------------- 希望能用! --------------------编程问答-------------------- 关注下! --------------------编程问答-------------------- 关注下! --------------------编程问答-------------------- 哈哈!自定义的View的话,也可以使用view的隐藏和显示属性的!
不过切换的view过多,实现起来比较麻烦!
如果是游戏的话,通过游戏动画来实现!技术要求比较高! --------------------编程问答-------------------- 来看看
呵呵 --------------------编程问答-------------------- 我先眯一会.......... --------------------编程问答-------------------- 在AndroidManifest.xml里面注册一个
<activity android:name=".EditActivity"/>


代码
Intent it = new Intent(".EditActivity");

startActivity(it);// 酱紫你就可以切换了 --------------------编程问答-------------------- package zhao.random;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class RandomActivity extends Activity {
    
    private Button btn ;
    String random = null;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btn = (Button) this.findViewById(R.id.Random); 
        btn.setText("Let's Rool it!");
        btn.setOnClickListener(new ButtonListener());
        //将监听器绑定在按钮上
    }
   
   //设置监听器 
    class ButtonListener implements OnClickListener, android.view.View.OnClickListener{   
    public void onClick(View v) {
    Intent intent = new Intent();
    intent.setClass(RandomActivity.this,showActivity.class);
    //从哪儿到哪儿。。。从RandomActivity到showActivity
    // intent.getExtras("random",random);
    RandomActivity.this.startActivity(intent);
}

public void onClick(DialogInterface dialog, int which) {
}

}
}


http://blog.sina.com.cn/s/blog_6a528c550100zhhk.html --------------------编程问答--------------------
引用 52 楼 zhaoyingkun 的回复:
package zhao.random;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.……


不是这个意思,真是这种情况的话,我也不至于在这边发文啊
是从View切换到View,不是在activity中直接切换 --------------------编程问答-------------------- --------------------编程问答-------------------- 书上看到一个示例,在Activity中添加一个handler,根据handleMessage(Message msg)msg的值来setContentview(自定义的View) --------------------编程问答-------------------- 自定一个抽象的BaseControl,每个BaseControl及inflate的一个xml,BaseControl继承广播 --------------------编程问答-------------------- --------------------编程问答-------------------- 在touch的view里面传递message到activity的handler,然后handler里面进行页面切换,也就是setcontentview --------------------编程问答-------------------- 你在主的Activity里面用个
switch(iFlag)
{
case 1:
MyActivity.this.setContentView(myView1);
break;
case 2:
MyActivity.this.setContentView(myView2);
break;
}
你extern的View类里,必须在destruct函数里清空所有的非法内存资源
View里需要切换界面的时候,只要给MainActivity通下信就行了,会自动切换必调用你的析构函数
我当初开发游戏就是这样做的 --------------------编程问答-------------------- View view =new XXXView(Context);
setContentView(view); --------------------编程问答-------------------- --------------------编程问答--------------------
引用 14 楼 a5864131452 的回复:
这个要用到java开发语言的多态

例如:

public void onDraw(canvas c)
{
  switch(GameState)
  {
  case:DrawLogo(c);break;
  case:DrawMenu(c);break;
  }

}

public void DrawLogo(canvas c){}

public void ……

受教了 --------------------编程问答-------------------- 请问楼主,选关界面是怎么做的? --------------------编程问答-------------------- --------------------编程问答-------------------- 楼主你这样做会遇到内存溢出问题吗,你每次切换的时候都要初始化一次下个view这样,你怎么把看不见的view回收呢 --------------------编程问答-------------------- --------------------编程问答-------------------- 给跪!!!!!!!!!!!!!!!! --------------------编程问答--------------------
引用 16 楼  的回复:
Java code

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class HandleMessage extends Activity implement Runnable{
    @Override……
这个是正解,已经使用中,另外发现一点,能使用.setContentView的只有 activity的主线程,自己建的线程或者其他View都只能用例子那样发送消息,如果在其他线程调用 setContentView编译不报错的,但是运行会报错,好在有完整的错误提示,不然死都不知道怎么死的,不过这样说,那么处理消息的就是 activity的主线程哦,消息处理方法里小心别加阻塞的活动,不然假死 --------------------编程问答--------------------
引用 65 楼  的回复:
楼主你这样做会遇到内存溢出问题吗,你每次切换的时候都要初始化一次下个view这样,你怎么把看不见的view回收呢

              不要使用setContentView(R.xxx)来实例View
用下面的
                LayoutInflater inflater = getLayoutInflater();//LayoutInflater是把XML转变成View对象的东西
View InputView= inflater.inflate(R.layout.activity_touch, null);
                  setContentView(InputView);
既然我受教了就完善这问题吧
有对象就好搞了 --------------------编程问答-------------------- 你游戏里写好触屏事件的吧?
直接把游戏视图加载到Activity,你在Activity做一个欢迎画面或logo,然后就跳转到游戏了,和Activity没联系了 --------------------编程问答-------------------- 现在大多数应用都用到这一技术,其实这也很简单,用一个Gallery 就可以了,在当前Activity中加载这几张图片,然后用ViewFlipper来让他们左右动画起来!   希望对你有帮助!
--------------------编程问答-------------------- 很多游戏、游戏引擎就一个view,根据游戏逻辑绘制不同的画面就行了- - --------------------编程问答-------------------- 最科学的做法是14楼提供的那个。 --------------------编程问答-------------------- fragment应该是你想要的。去google一下吧 --------------------编程问答-------------------- 初识安卓。。。帮顶 --------------------编程问答-------------------- activitygroup 可以动态切换内部布局,包括控件,不过 还是有xml  也可以代码实现 --------------------编程问答-------------------- 学习了 --------------------编程问答--------------------
引用 5 楼 licaiyuren 的回复:
[Quote=引用 2 楼 lg707415323 的回复:]

View view =new XXXView(Context);
setContentView(view);


我不是在activity类中切换界面,我是想从当前的View中,响应 onTouchEvent()以后,直接切换到一个新的View。能否提供个思路啊,新手,多指教

这种方法就是啊! --------------------编程问答-------------------- 可以用fragment试试
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,