2014-02-05 3 views
3

Я пытаюсь создать приложение для учета времени, которое я могу использовать на работе. Я вставил код для двух моих классов ниже. Моя головоломка не должна передавать или хранить данные только, как вернуться к исходному виду, если я открыл объект canvas. Можно ли использовать намерение открыть активность, а не просто создать объект «tv» (в методе openTEV)? Это будет означать, что когда я нажимаю кнопку «назад» в правом нижнем углу моего телефона Galaxy, она прекратит эту активность и вернется к первому с помощью объектов EditText, в которые я ввел строки. В настоящий момент нажатие кнопки «Назад» завершает все приложение. Или я не понимаю, как работает андроид?Объект против Android Активность

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; 
} 
+0

у вас есть два вида деятельности или один? –

+0

Я считаю, что у меня есть один на данный момент (MainActivity). Когда я создаю объект для MyTouchEventView, я предполагаю, что это не создает активность. Мой вопрос: как я это сделаю? – acl77

ответ

2

Как вы сказали, вы хотите открыть новый вид деятельности с вашего openTEV методом ... Я прав? ?? для достижения этого, прежде всего, у вас есть деятельность, которую вы хотите начать с активности.

Предположим, у вас есть два вида деятельности, которые MainActivity и BActivity. Теперь вы хотите, когда openTEV будет использован метод BActivity должен начинаться с MainActivity. Теперь то, что вам нужно сделать, это написать следующий код в ваш openTEV методом ...

Intent intent = new Intent(MainActivity.this, BActivity.class); 
startActivity(intent); 

Теперь, когда вы нажмете кнопку назад в BActivity тогда вы вернётесь MainActivity.

+0

Я просто попытался заменить код в моем методе openTEV() двумя строками выше, чтобы создать новое действие с намерением. Это заставляет мое приложение закрываться. Я получаю «FATAL EXCEPTION: main» в LogCat. Я только что понял, что мне, вероятно, придется сделать файл макета, чтобы перейти с новым действием. Теперь я понятия не имею, какой вид можно разместить в файле XML. Нужен ли мне просмотр во втором файле макета? – acl77

+0

да ... вам нужна работа с макетом. Для этого нажмите значок ** Новый ** в верхнем левом углу, затем появится окно ... выберите ** Действие Android ** ... нажмите ** Далее ** ... затем ** Далее **. ... затем введите свое новое название деятельности ... затем нажмите кнопку ** Готово ** ... Теперь вы создали новое действие. Теперь вы можете начать свою новую деятельность с ** MainActivity ** с помощью вышеупомянутого процесса, как я уже упоминал. –

+0

Я создал новое действие в соответствии с вашими инструкциями. Но я потратил полчаса на то, чтобы связать MyTouchEventView с ним, чтобы он имел холст. Я не думаю, что я даже приблизился. Как мне это сделать? – acl77

1

Вы не открыли свой «объект холста». Ваш объект canvas является View, как и любой другой вид, например. TextView, ImageView, EditText и т. Д. Вы расширили класс вида, чтобы создать новый тип представления.

Здесь вы настраиваете содержимое своей и только своей деятельности на свое собственное представление.

tv = new MyTouchEventView(this); 
setContentView(tv); 

Как только один вид деятельности, при нажатии на кнопку назад, ваше приложение закончится - так как нет больше действий для отображения пользователю.

Чтобы иметь возможность взаимодействовать с MyTouchEventView, создайте новое мероприятие, настройте контент для своего вида, как вы делаете выше, затем запустите новое действие с помощью Intent. Когда вы нажмете кнопку «Назад», вы вернетесь к своей текущей деятельности, MainActivity.

Нельзя использовать setContentView не один раз в своей деятельности. Думайте о деятельности как о единственной, сфокусированной вещи, с которой пользователь взаимодействует - экран, если хотите.

http://developer.android.com/guide/components/tasks-and-back-stack.html

Я вижу, что вы создаете кнопку в вашем представлении. Это неверно. a View - это самый низкий уровень компонента интерфейса. A View не может содержать другие виды.Для этого вы используете ViewGroup, например LinearLayout, RelativeLayout и т. Д. Также вы можете добавить свое собственное представление в свой XML-макет, чтобы вам не нужно было создавать его в коде. Как правило, хорошей практикой является разделение кода и пользовательского интерфейса.

Смотрите это для того, как добавить свой взгляд на макет XML

http://developer.android.com/guide/topics/ui/custom-components.html

0

Подумайте, если я не ошибаюсь, чем просто сделать ребенка деятельность. При создании нового действия вы получите опции для отображения одного из действий, которые у вас уже есть, в качестве активности родительской активности. Таким образом, таким образом вы получите панель бездействия обратной навигации, с помощью которой u может легко перейти к родительской активности ur с дочернего элемента. ANd on mainActivity (parent) просто использует намерение перейти к активности дочернего ур.

Intent intent = new Intent(MainActivity.this, BActivity.class); //BActivity-the child activity 
startActivity(intent); 
Смежные вопросы