Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象与Android活动_Java_Android - Fatal编程技术网

Java 对象与Android活动

Java 对象与Android活动,java,android,Java,Android,我正在尝试为自己制作一个可以在工作中使用的时间表应用程序。我已经在下面粘贴了我的两个类的代码。我的难题是不必传递或保留数据,只要打开画布对象后如何返回到原始视图即可。是否可以使用意图来打开活动,而不仅仅是创建“tv”对象(在openTEV方法中)?这意味着,当我点击Galaxy手机右下角的“后退”按钮时,它将停止该活动,并返回到第一个带有我输入字符串的EditText对象的活动。此时,点击后退按钮结束整个应用程序。还是我误解了安卓的工作原理 MainActivity.java- public c

我正在尝试为自己制作一个可以在工作中使用的时间表应用程序。我已经在下面粘贴了我的两个类的代码。我的难题是不必传递或保留数据,只要打开画布对象后如何返回到原始视图即可。是否可以使用意图来打开活动,而不仅仅是创建“tv”对象(在openTEV方法中)?这意味着,当我点击Galaxy手机右下角的“后退”按钮时,它将停止该活动,并返回到第一个带有我输入字符串的EditText对象的活动。此时,点击后退按钮结束整个应用程序。还是我误解了安卓的工作原理

MainActivity.java-

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);
假设您有两个活动,分别是MainActivityBActivity。现在,您需要,当执行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。