Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Работа с Handler из другого активити

Здравствуйте, пишу чат приложение и не могу понять как можно обрабатывать входящие сообщение из другого активити.
У меня есть форма авторизации где я устанавливаю хандлер на все входящие сообщения:

Код Java(TM) 2 Platform Standard Edition 5.0
1
2
ResultHandler handler = new ResultHandler();
MGey.setUpdates(handler);
ResultHandler - отдельный класс куда идут все входящие сообщения.

Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
public class ResultHandler {
    @Override
    public void onResult(ChatObject object)
    {
        //receive message object from server
    }
}
Далее, у меня есть активити с окном чата, куда мне надо кидать каждое новое сообщение, полученное в этом хандлере.
Я так понимаю, что мне нужно в класе ResultHandler как-то передавать объект, а в другой активити как-то его принимать.
Т.е допустим если пришло новое сообщение

Код Java(TM) 2 Platform Standard Edition 5.0
1
2
if object instanceof ChatObject.NewMessage
//передать его активити Chat.java
Далее нужно принять этот объект в активити Chat.java и затем уже его использовать.

Как это сделать правильно?
Ответ: По приходу ссобщения из хендлера кидать Intent c "прикреплёнными" к нему нужными данными через putExtra.
А в другой активити вешать "слушателя" и ловить его.
Смотрите связку BroadcastReceiver + LocalBroadcastManager
Вопрос: Передача ссылки на объект между Активити

Добрый день уважаемые!

Подскажите пожалуйста как передать ссылку на объект в другое активити, а потом получить обратно ссылку именно на тот же объект?
Пробовал через Parcelable, но возвращает другой экземпляр объекта.
Остается только приравнивать ссылку в первом активити ко второй. Но если она в List, то мне нужно доп. костыли применять, для того чтобы ее сначала найти в списке, а только потом заменить.
Решил вот спросить, может есть другие способы.

Спасибо.
Ответ:
Сообщение от asttoxa
Пойду покурю фрагменты наверное для этой цели.
С фрагментами тоже засада есть. Есть фр1, фр2, фр3 и тд. Сейчас требуется фр1 что то там сделали, по ходу вызвали фр2 повернули экран, все что сделали во фр1 не сохраняется. Bundle savedInstanceState в этом случае не помогает, костыль нужен. С двумя активностями оказалось проще реализовать и фик с ним пусть объекты дублируются. Все равно вторую активность закроете объекты мусорщик уберет. В вашем случае просто передавать ArrayList через интент.
Вопрос: Как получить доступ к методам объекта класса наследуемого от Activity, когда он выводится во вкладку

В главном Активити создаются вкладки на котовые выводятся другие активити.

Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost);
        LocalActivityManager localActivityManager = new LocalActivityManager(this, false);
        localActivityManager.dispatchCreate(savedInstanceState);
        tabHost.setup(localActivityManager);
        tabHost.getTabWidget().setDividerDrawable(R.drawable.divider2);
        TabHost.TabSpec tabSpec;
        
        View v1 = createTabView(tabHost.getContext(), "Заявки");             /// Первая вкладка
        tabSpec = tabHost.newTabSpec("tag1");
        tabSpec.setIndicator(v1);
        Intent intent1=new Intent(this, Orders.class);
        tabSpec.setContent(intent1);
        tabHost.addTab(tabSpec);
 
 
        tabSpec = tabHost.newTabSpec("tag2");                                       ///Вторая вкладка
        View v2 = createTabView(tabHost.getContext(), "Маршрут");
        tabSpec.setIndicator(v2);
        tabSpec.setContent(new Intent(this, Route.class));
        tabHost.addTab(tabSpec);
в Orders.class объявлен метод "refreshFromDataBase()", я хочу вызывать этот метод из меню, меню сделано, в обработчик нажатия пункта меню я попадаю, а как в обработчике запустить метод не знаю. Как получить доступ к объекту Orders.class который находится на первой вкладке, чтобы вызвать метод "refreshFromDataBase()"
Ответ: heid, ещё раз. Надо использовать фрагменты.
Вопрос: Не отображается игровое поле после выхода из другого активити

Когда я выхожу из другого активити и пытаюсь зайти в игру,котороe у меня в главном активити,игровое поле не отображается.
вот мой код.в чем дело
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package es.eduards.pacman;
 
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.AudioManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.widget.Toast;
 
 
 
import es.eduards.pacman.pcmangame.Pacman;
import es.eduards.pacman.pcmangame.Playfield;
import es.eduards.pacman.pcmangame.Score;
import es.eduards.pacman.util.RequestCode;
 
 
public  class GameActivity extends Activity implements OnClickListener{
    private static final String TAG="States";
    private PacmanGame game;
    private Playfield playfield;
    private GameView gameView;
    private SharedPreferences sPref;
    final String SAVED_SCORE="saved_score";
    final String SAVED_LIVE="saved_live";
    final String SAVED_LEVEL="saved_level";
    final String SAVED_DOTS="saved dots";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        PacmanGame game = initGame();
 
        initGameView(game);
        initMainView();
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
    }
 
    @Override
    public void onResume() {
        super.onResume();
        game.resume();
        Log.d(TAG, "MainActivity: onResume()");//for debug only
    }
    @Override
   public void onRestart(){
        super.onRestart();
        Log.d(TAG,"MainActivity:onRestart()");
    }
    @Override
    public void onPause() {
        super.onPause();
        game.pause();
        Log.d(TAG, "MainActivity: onPause()");//for debug only
    }
    @Override
    public void onDestroy(){
       saveGame();
        super.onDestroy();
        Log.d(TAG, "MainActivity: onDestroy()");//for debug only
 
    }
 
    private void initMainView() {
        setContentView(R.layout.activity_game);
 
        View newGameButton = findViewById(R.id.new_game_button);
        newGameButton.setOnClickListener(this);
        View continueButton = findViewById(R.id.continue_button);
        continueButton.setOnClickListener(this);
        View aboutButton=findViewById(R.id.about_button);
        aboutButton.setOnClickListener(this);
        View exitButton = findViewById(R.id.exit_button);
        exitButton.setOnClickListener(this);
 
    }
 
    private void initGameView(PacmanGame game) {
        gameView = new GameView(this);
        game.view = gameView;
        gameView.game = game;
    }
   /*
   Returns the game constructor
    */
    private PacmanGame initGame() {
        game = new PacmanGame(this);
 
 
        game.init();
 
        return game;
    }
    private void transitionToGameView() {
        setContentView(gameView);
        gameView.setFocusable(true);
    }
 
    /**
     * Saves the existing mode of the game in order to reload it
     * in the near future
     */
    void saveGame(){
        sPref=getPreferences(MODE_PRIVATE);
        Editor ed=sPref.edit();
        ed.putInt(SAVED_SCORE, game.getScore());
        ed.putInt(SAVED_LEVEL,game.getLevel());
        ed.putInt(SAVED_LIVE,game.getLives());
 
        ed.commit();
        Toast.makeText(this,"Game saved",Toast.LENGTH_SHORT).show();//for debug only
    }
 
    /**
     * Reloads saved game
     */
   void loadGame(){
      sPref=getPreferences(MODE_PRIVATE);
      int savedScore=sPref.getInt(SAVED_SCORE, 8);
      int savedLevel=sPref.getInt(SAVED_LEVEL,9);
      int savedLive=sPref.getInt(SAVED_LIVE,10);
      int savedDots=sPref.getInt(SAVED_DOTS,11);
       game.setScore(savedScore);
       game.setLevel(savedLevel);
       game.setLives(savedLive);
       game.startNewGame();
       Toast.makeText(this,"Game loaded",Toast.LENGTH_SHORT).show();//for debug only
 
    }
    @Override
    public void onClick(View v) {
        Intent intent;
        switch (v.getId()) {
            case R.id.new_game_button:
                 transitionToGameView();
                 game.startNewGame();//completely new game
                break;
            case R.id.continue_button:
                 try{
                     transitionToGameView();
                    loadGame();//reloaded game
                 }catch(NullPointerException npe) {
                     System.out.println("No any data");
                     transitionToGameView();
                     game.startNewGame();
                }
                break;
            case R.id.about_button:
               intent=new Intent(this,AboutActivity.class);
                startActivity(intent);
                break;
            case R.id.exit_button:
                finish();
                break;
        }
 
    }
 
 
}
Ответ: Я пробовал так стопицот раз,это не помогает
Вопрос: OnNavigationItemSelected, как подгружать другие активити?

Всем привет, столкнулся с такой проблемой.
Не пойму как правильно при помощи onNavigationItemSelected подгружать другие активити.
Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
8
9
10
@Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                drawerLayout.closeDrawers();
                switch (menuItem.getItemId()) {
                    case R.id.actionNotificationItem:
                         ?????
                    
                }
                return true;
            }
есть активити с с простым textview, что надо указать в case?
Заранее спасибо)
Ответ:
Вопрос: Как вызвать другое активити в контексном меню

Как вызвать другое активити в контексном меню
Ответ: Вопрос интересный, не из контексного меню, а в контексном меню.
Вопрос: Если поменять ориентацию экрана или SurfaceView перекроет другой активити, то приложение завершается аварийно

Здравствуйте уважаемые программисты!
Недавно начал изучать проигрывание видео под android. Получилось вывести видео на экран при помощи surfaceview и mediaplayer, но столкнулся с такой бедой, если поменять ориентацию экрана или если surfaceview перекроет другой активити, то приложение завершается аварийно. Покопался в интернете, ничего путного не нашел, только то, что нежно перегрузить функции обратного вызова, поискать примеры и нашел только примеры с применением графики в opengl, но не думаю, что они подходят, поэтому я прошу вашей помощи.
P.S. заранее спасибо
Ответ: самое простое запомнить сколько проигралось времени и после перерисовки начать воспроизведение не с начала
Вопрос: Коллекция из parcelable объектов передается в активити с вызовом исключения

Суть в том, что в одной активити я создаю коллекцию из объектов. Но это не просто коллекция, там есть объекты и их наследники, приведенные к одному родительскому типу.

Грубо говоря, коллекция состоит из элементов A и B, причем B extends A
Эту коллекцию, я кладу в Bundle и передаю через Intent.

При этом, для класса A имплементирую интерфейс Parcelable, со всеми необходимыми методами, также, я создаю реализации всех этих методов и в классе наследнике B.

В итоге, код работет как надо, в целевой активити я ловлю и разбираю коллекцию, но в логах выскакивает следующее исключение:

Parcel: Class not found when unmarshalling: mypackage.B ... java.lang.ClassNotFoundException

(работаю в Android Studio, сразу тестирую на устройстве)

Как исправить эту проблему и что это значит?
Заранее спасибо, всем кто поможет, или не поможет а прочтет...
Ответ: да нет, не помогло=(. Странно, что с передачей данных проблем нет. Данные передаются, а исключение почему то выкидывает всегда, как бы я parcelable не конфигурировал. Почти все случаи о которых читал на stackoverflow, говорят о том, что такая ошибка может повляться когда неправильно определен ClassLoader. пытался я и его явно прописать, через getClassloader, ничего у меня из этого не вышло.
Вопрос: Класс ждет действия и "дарит" данные активности

Вот сижу и думаю:
А реально сделать класс, который будет работать в отдельном потоке. Он постоянно проверяет что то (while (true)) и если действие происходит, то оно сообщает активити о действии. Тут все понятно. Но есть одно но, а что если мы запустили этот класс и стартанули другое активити, не завершая этого. Так вот, будет ли этот класс работать в это время? Крашнется ли все это? Или заработает все отлично и все будет обновляться и когда мы перейдем на тот класс снова, кнопкой назад, и тут будет все прекраснос обновленным листвью и т.д.?
Ответ: akyma40,

Не по теме:

этого гугл не выдаст,это основано на опыте более года дружбы с андрюхой


У вашего приложения ВСЕГДА должна быть КОНЦЕПЦИЯ и МАКЕТ, если нет чего-то из них,то в большом проекте будет туго, придется его переписывать часто, а кому кайф 10к кода переписывать?
Еще есть пару замечаний:
1) В этом классе можно хранить экземпляры объектов таких как БД, нотификации и т.д., но помните о том, что это как и сервис часть приложения, а значит он работает в основном потоке;
2) Для "тяжелых и долгих" операций используется всегда сервис, или хотя бы класс отдельный;
3) Для объектов БД и нотификаций лучше всего использовать паттерн Singleton, шаблон которого вы можете добавить из студии

Добавлено через 4 минуты
Забыл еще кое-что, как получить этот класс в активити:
Java
1
2
3
4
5
    private App app;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
     app = (App) getApplication();
Вопрос: Скрыть элемент View после ввода логина и пароля на другом активити

Доброго времени суток.
Подскажите как скрыть элемент View на другой активити после перехода на нее через логин и пароль.

пробую
Java
1
2
textView.setVisibility(View.GONE);
textView2.setVisibility(View.GONE);
выдает ошибку но переходит на активити при этом элемент View не скрывается.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
public class LoginDialogActivity extends Activity implements OnClickListener {
 
    
    Button btnLoginDialog, btnLoginDialog2;
    TextView textView2, textView;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        
        btnLoginDialog = (Button) findViewById(R.id.btnLoginDialog);
        btnLoginDialog.setOnClickListener(this);
        btnLoginDialog2 = (Button) findViewById(R.id.btnLoginDialog2);
        btnLoginDialog2.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnLoginDialog:
        if (v == btnLoginDialog) {
 
            
            final Dialog login = new Dialog(this);
            
            login.setContentView(R.layout.login_dialog);
            login.setTitle("Login");
 
            
            Button btnLogin = (Button) login.findViewById(R.id.btnLogin);
            Button btnCancel = (Button) login.findViewById(R.id.btnCancel);
            final EditText txtUsername = (EditText)login.findViewById(R.id.txtUsername);
            final EditText txtPassword = (EditText)login.findViewById(R.id.txtPassword);
 
            
            btnLogin.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Editable loginEntered = txtPassword.getText();
                    if (!loginEntered.toString().equals("123456")) {
                        Toast.makeText(getApplicationContext(), "Неверный Логин или пароль", Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(getApplicationContext(), "Вы успешно вошли", Toast.LENGTH_LONG).show();
                        goTest1Activity(v);
                    }
 
                    Editable loginEntered2 = txtUsername.getText();
                    if (!loginEntered2.toString().equals("Test")) {
                        Toast.makeText(getApplicationContext(), "Неверный Логин или пароль", Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(getApplicationContext(), "Вы успешно вошли", Toast.LENGTH_LONG).show();
                        goTest1Activity(v);
                }
            }
        });
            btnCancel.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    login.dismiss();
                    Toast.makeText(getApplicationContext(), "Отмена", Toast.LENGTH_LONG).show();
                }
            });
 
            // Make dialog box visible.
            login.show();
        }
            case R.id.btnLoginDialog2:
                if (v == btnLoginDialog2) {
 
                    
                    final Dialog login = new Dialog(this);
                    
                    login.setContentView(R.layout.login_dialog);
                    login.setTitle("Login");
 
                    
                    Button btnLogin = (Button) login.findViewById(R.id.btnLogin);
                    Button btnCancel = (Button) login.findViewById(R.id.btnCancel);
                    final EditText txtUsername = (EditText)login.findViewById(R.id.txtUsername);
                    final EditText txtPassword = (EditText)login.findViewById(R.id.txtPassword);
 
                    
                    btnLogin.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Editable loginEntered = txtPassword.getText();
                            if (!loginEntered.toString().equals("123")) {
                                Toast.makeText(getApplicationContext(), "Неверный Логин или пароль", Toast.LENGTH_LONG).show();
                            } else {
                                Toast.makeText(getApplicationContext(), "Вы успешно вошли", Toast.LENGTH_LONG).show();
                                goTest2Activity(v);
                            }
 
                            Editable loginEntered2 = txtUsername.getText();
                            if (!loginEntered2.toString().equals("Test2")) {
                                Toast.makeText(getApplicationContext(), "Неверный Логин или пароль", Toast.LENGTH_LONG).show();
                            } else {
                                Toast.makeText(getApplicationContext(), "Вы успешно вошли", Toast.LENGTH_LONG).show();
                                goTest2Activity(v);
                            }
                        }
 
                    });
                    btnCancel.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            login.dismiss();
                            Toast.makeText(getApplicationContext(), "Отмена", Toast.LENGTH_LONG).show();
                        }
                    });
 
                    // Make dialog box visible.
                    login.show();
                }
    }
    }
 
 
    public void goTest1Activity(View v) {
        Intent intent = new Intent(this, Test1Activity.class);
        startActivity(intent);
        textView2.setVisibility(View.GONE);
        Toast.makeText(getApplicationContext(), "Перешел Тест1", Toast.LENGTH_LONG).show();
    }
 
    public void goTest2Activity(View v) {
        Intent intent = new Intent(this, Test2Activity.class);
        startActivity(intent);
        textView.setVisibility(View.GONE);
        Toast.makeText(getApplicationContext(), "Перешел тест2", Toast.LENGTH_LONG).show();
    }
 
 
    }
Ответ: нельзя образаться к TextView которое находится в разметке другой активити
после проверки ввода на первой активити, надо передать boolean значение во вторую активити
Java
1
2
3
4
5
    public void goTest1Activity(View v) {
        Intent intent = new Intent(this, Test1Activity.class);
        intent.putExtra("LOGIN_SUCCESS", true); // true если пользователь успешно вошел, иначе false
        startActivity(intent);
    }
во второй активити, после setContentView находишь через findViewByIdсвое TextView (которое надо спрятать)
и пишешь что-то типа
Java
1
        boolean success = getIntent().getBooleanExtra("LOGIN_SUCCESS", false);
и дальше если переменная success = false - прячешь текствью

перечитай то, что я написал много раз, а потом почитай про передачу параметров между активностями