Java 对象与Android活动
我正在尝试为自己制作一个可以在工作中使用的时间表应用程序。我已经在下面粘贴了我的两个类的代码。我的难题是不必传递或保留数据,只要打开画布对象后如何返回到原始视图即可。是否可以使用意图来打开活动,而不仅仅是创建“tv”对象(在openTEV方法中)?这意味着,当我点击Galaxy手机右下角的“后退”按钮时,它将停止该活动,并返回到第一个带有我输入字符串的EditText对象的活动。此时,点击后退按钮结束整个应用程序。还是我误解了安卓的工作原理 MainActivity.java-Java 对象与Android活动,java,android,Java,Android,我正在尝试为自己制作一个可以在工作中使用的时间表应用程序。我已经在下面粘贴了我的两个类的代码。我的难题是不必传递或保留数据,只要打开画布对象后如何返回到原始视图即可。是否可以使用意图来打开活动,而不仅仅是创建“tv”对象(在openTEV方法中)?这意味着,当我点击Galaxy手机右下角的“后退”按钮时,它将停止该活动,并返回到第一个带有我输入字符串的EditText对象的活动。此时,点击后退按钮结束整个应用程序。还是我误解了安卓的工作原理 MainActivity.java- public c
public class MainActivity extends Activity {
private MyTouchEventView tv;
private EditText et1;
private EditText et2;
private EditText et3;
private EditText et4;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1 = (EditText) findViewById(R.id.editText1);
et2 = (EditText) findViewById(R.id.editText2);
et3 = (EditText) findViewById(R.id.editText3);
et4 = (EditText) findViewById(R.id.editText4);
}
public void processForm(View v) {
String txt = et1.getText().toString();
Toast.makeText(this.getApplicationContext(), txt, Toast.LENGTH_LONG).show();
}
@Override
protected void onPause() {
super.onPause();
Log.i("TAG", "Paused");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_save:
saveCanvasImage();
return true;
case R.id.action_sign:
openTEV();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void saveCanvasImage() {
tv.setDrawingCacheEnabled(true);
Bitmap bm = tv.getDrawingCache();
String fPath = Environment.getExternalStorageDirectory().toString();
fPath = fPath + "/Pictures";
File f = null;
String s = getCurrDate();
s = s + ".png";
f = new File(fPath, s);
try {
FileOutputStream strm = new FileOutputStream(f);
bm.compress(CompressFormat.PNG, 80, strm);
strm.flush();
strm.close();
}
catch (IOException e){
e.printStackTrace();
}
}
public void openTEV() {
tv = new MyTouchEventView(this);
setContentView(tv);
addContentView(tv.btnReset, tv.params);
}
public String getCurrDate()
{
String dt;
Date dNow = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddkkmmss");
dt = sdf.format(dNow);
return dt;
}
MyTouchEventView.java-
public class MyTouchEventView extends View {
private Paint paint = new Paint();
private Path path = new Path();
public Button btnReset;
public LayoutParams params;
public MyTouchEventView(Context context) {
super(context);
paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(10f);
btnReset = new Button(context);
btnReset.setText("Clear Screen");
params = new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT);
btnReset.setLayoutParams(params);
btnReset.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
// resets the screen
path.reset();
// Calls the onDraw() method
postInvalidate();
}
});
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Gives you x and y coordinates on the Event.
float pointX = event.getX();
float pointY = event.getY();
// Checks for the event that occurs
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path.moveTo(pointX, pointY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(pointX, pointY);
break;
case MotionEvent.ACTION_UP:
//;
break;
default:
return false;
}
// Schedules a repaint.
// Force a view to draw.
postInvalidate();
return true;
}
正如你所说,你想从你的openTEV方法中打开一个新的活动……我说的对吗???要实现这一点,首先要从活动开始进行活动
Intent intent = new Intent(MainActivity.this, BActivity.class); //BActivity-the child activity
startActivity(intent);
假设您有两个活动,分别是MainActivity和BActivity。现在,您需要,当执行openTEVmetod时,BActivity应该从MainActivity开始。现在您要做的是将以下代码写入您的openTEV方法中
Intent intent = new Intent(MainActivity.this, BActivity.class);
startActivity(intent);
现在,当您按下“活动”中的“后退”按钮时,您将返回MainActivity您尚未“打开”您的“画布对象”。您的画布对象是一个视图
,与任何其他视图一样,例如文本视图
、图像视图
、编辑文本
等。您已经扩展了视图类以创建新的视图类型
在这里,您可以将“唯一”活动的内容设置为自定义视图
tv = new MyTouchEventView(this);
setContentView(tv);
由于您只有一个活动,当您按下后退按钮时,您的应用程序将结束-因为没有更多的活动可显示给用户
要能够与MyTouchEventView
交互,请创建一个新活动,按照上面的操作将其内容设置为您的视图,然后以意图启动新活动。按后退按钮时,您将返回到当前活动,MainActivity
在活动中多次使用setContentView
是不常见的。把一个活动想象成一个单一的、有重点的东西,用户可以与之交互——如果你喜欢的话,可以用一个屏幕
我看到您正在视图中创建一个按钮。这是不对的。视图是接口组件的最低级别。视图
不能包含其他视图。为此,您可以使用视图组
,例如线性布局
,相对视图
等。还可以将自定义视图添加到XML布局中,这样您就不必在代码中创建它。将代码和UI分开通常是一种很好的做法
有关如何将视图添加到布局XML,请参见此
如果我没有错的话,想一想,而不仅仅是做一个孩子的活动。创建新活动时,您将获得显示您已经拥有的活动之一的选项-作为新活动父活动。所以,通过这种方式,您将获得一个反向导航不活动栏,通过它您可以轻松地从子项导航到父项活动。
在主活动(父活动)上,只需使用intent转到您的子活动
Intent intent = new Intent(MainActivity.this, BActivity.class); //BActivity-the child activity
startActivity(intent);
你有两项活动还是一项?我相信我现在有一项(主要活动)。当我为MyTouchEventView创建对象时,我假设这不会创建活动。我的问题是如何做到这一点?我只是尝试用上面的两行代码替换openTEV()方法中的代码,以创建一个具有意图的新活动。这导致我的应用程序关闭。我在日志中得到“致命异常:主要”。我刚刚意识到我可能需要制作一个布局文件来配合新的活动。现在我不知道在XML文件中放什么样的视图。我需要第二个布局文件中的视图吗?是的…你需要一个带有布局的活动。为此,按左上角的新图标,然后会出现一个窗口…选择Android活动…按下一步…然后按下一步…然后给出新活动名称…然后按完成…现在您已经创建了一个新活动。现在,您可以通过上面提到的流程从MainActivity开始新活动。我已经按照您的说明创建了一个新活动。但我花了半个小时试图将MyTouchEventView与之关联,这样它就有了画布。我想我还没有接近。我如何做到这一点?按照前面的方法将MyTouchEventView与您的第二个活动关联起来,就像您对MainActivity所做的那样。我看不出这是如何工作的。当我创建一个新活动时,它创建了一个新的布局文件,activity_brush.xml。要执行MainActivity中的操作,我必须删除onCreate中的setContentView(R.layout.activity_brush)行,并将其替换为setContentView(tv)。当然,我必须离开活动向导创建的setContentView。什么;把我赶出去的原因是我有三节课。MainActivity、BrushActivity、MyTouchEventView(扩展视图)。我只是不知道如何从活动中使用MyTouchEventView。