Можно ли получить доступ к объекту деятельности из другого места?

1

Это может быть глупая идея, но кто-нибудь знает, можно ли получить доступ к одной форме объекта деятельности в других местах?

Чтобы быть конкретным, скажем, если у вас есть активность A (с textView t), и вы создаете нормальный Java-класс B.

В onCreate вы начинаете запускать B для некоторых вычислений, как показано ниже,

public class MyActivity extends Activity {
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    t = (TextView)findViewById(R.id.outputtext);
    Somejava B = new Somejava();
    B.run();
  }
}

Есть ли способ для B обновить textView?

Я знаю простой способ (возможно, правильный путь) - вернуть результат из класса B и использовать t.setText(result) в MyActivity, но я просто хочу знать, можно ли обновить текстовое представление в B?

Теги:
android-activity

4 ответа

0
Лучший ответ

может просто передать действие refernce в b в конструкторе и создать метод в вашей acitivty для обновления textview. если вы используете другой поток, не забываете использовать обработчик или другие способы обновления потока пользовательского интерфейса.

  • 0
    извините, я действительно новичок в Android, не могли бы вы объяснить, как вы передаете ссылку на активность b? Я использую B = новый класс B (это) ... и тогда конструктор B является общедоступным B (Activity Activity) {} ... кажется, он не работает
  • 0
    Почему ? Вы можете создать более конкретный здесь, если не соответствует этому ... 1 - можно использовать общедоступный B (MyActivity активность) {} 2 - создать метод updateTextView () в MyActivity 3 - вызвать activity.updateTextView () из класса B .... .......
Показать ещё 1 комментарий
1

Использовать целевые или общедоступные статические переменные

  • 0
    Я видел много примеров в интернете о намерениях, но все примеры, которые мне кажутся, используют его для передачи объекта новому действию, но в моем случае B - это просто Java-класс noraml, который выполняет некоторые вычисления в фоновом режиме. Вы все еще можете использовать намерение здесь?
  • 0
    Я пытаюсь использовать статическую переменную, и она дает ошибку говорит: android.view.ViewRootImpl $ CalledFormWrongThreadException: только исходный поток, который создал иерархию представлений, может касаться его представлений
Показать ещё 1 комментарий
0

Для "нормального класса Java" B я бы работал с interfaces

public interface SomejavaListener{
    void onSomejavaFinish(Object result);
}

public class MyActivity implements SomejaveFinish extends Activity {
  TextView t;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    t = (TextView)findViewById(R.id.outputtext);
    Somejava B = new Somejava();
    B.run(MyActivity.this); //notice the extra argument!
  }

  public void onSomejavaFinish(Object result){
    t.setText("updated! ^,^");
  }
}

public class Somejava {
    //...
    public void run(SomejavaListener callback){
        //working working
        callback.onSomejavaFinish( new Object() );
    }
}

Однако в отношении среды Android вопрос заключается в том, что у меня появилось ощущение, что AsyncTask будет правильным для вас. У этого есть метод doInBackground чтобы сделать работу, а не испортить ваш doInBackground пользовательского интерфейса (в результате чего возникли ошибки ANR). Еще одно преимущество - методы onPreExecute и onPostExecute запущены в самом onPostExecute пользовательского интерфейса, поэтому требуется просто обновить TextView

public class MyActivity extends Activity {
    TextView t;

    private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... void) {
         //do your stuff
         return null
     }

     protected void onPostExecute(Void void) {
         MyActivity.this.t.setText("updated ^^v");
     }
 }

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    t = (TextView) findViewById(R.id.outputtext);
    MyAsyncTask myAsyncTask = new MyAsyncTask();
    myAsyncTask.execute();
  }
}
0

Да, возможно, если поле "Активность" является общедоступным и публикует изменения пользовательского интерфейса в public Handler созданном в первом Activity но в фактах, это действительно уродливо сделать это...


Вы можете использовать startActivityForResult(...) чтобы уведомить другое действие о том, как процесс прошел с некоторыми серийными данными в Bundle extras для Intent и уловил результат в методе overrided onActivityResult(...)...

  • 0
    хорошо .. вот в чем дело .. я не хочу создавать другое действие .. класс B - это просто обычный класс java (не действие android)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню