Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
svd_sergey
1 / 1 / 0
Регистрация: 14.08.2012
Сообщений: 84
#1

Вызов метода из другого класса

28.01.2017, 16:51. Просмотров 418. Ответов 7
Метки нет (Все метки)

Не могу разобраться, почему вылетает приложение, когда пытаюсь задать текст для TextView в MainActivity из другого класса. Подскажите пожалуйста.

MainActivity.java:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class MainActivity extends Activity implements View.OnClickListener{
 
    Button btnSend;
    TextView tvStatus, tvResult;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        btnSend = (Button) findViewById(R.id.btnSend);
        btnSend.setOnClickListener(this);
 
        tvStatus = (TextView) findViewById(R.id.tvStatus);
        tvResult = (TextView) findViewById(R.id.tvResult);
    }
 
    public void showText(String text){
        tvResult.setText(text);
    }
}
SmsReceiver.java:
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
public class SmsReceiver extends BroadcastReceiver {
 
    public static final String SMS_BUNDLE = "pdus";
    private String smsResult = "";
    private MainActivity main;
 
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle intentExtras = intent.getExtras();
        if(intentExtras != null) {
            Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
            String smsMessageStr = "";
            String dateText = "";
 
            /**Получаем текст сообщения*/
            for(int i = 0; i < sms.length; i++) {
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);
 
                String smsBody = smsMessage.getMessageBody().toString();
                //String address = smsMessage.getOriginatingAddress();
                long timeMillis = smsMessage.getTimestampMillis();
 
                Date date = new Date(timeMillis);
                SimpleDateFormat format = new SimpleDateFormat("dd/MM/yy");
                dateText = format.format(date);
 
                smsMessageStr += smsBody;
            }
            /**Приписываем дату сообщения*/
            smsResult = dateText + ": " + smsMessageStr;
 
            /**Вывод*/
            Toast.makeText(context, smsResult, Toast.LENGTH_LONG).show();
            main.showText(smsResult);
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2017, 16:51
Ответы с готовыми решениями:

Вызов нестатического метода из другого класса
Здравствуйте. Подскажите, как можно вызвать нестатистический метод из другого...

Вызов метода из другого Activity
Здраствуйте. Помогите,пожалуйста, разобраться с несколькими вопросами: 1)...

Вызов метода из класса в таймере
Не могу получить титул веб страницы в таймере (ошибка). Пример: public...

Вызов Context из другого класса
Как вызвать Context из класса Output public class MapsActivity extends...

Null при вызове метода из другого класса
Суть такая. Я создал приложение с двумя активити NavigationView (через...

7
vxg
Модератор
3246 / 2047 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
28.01.2017, 18:33 #2
svd_sergey, потому что MainActivity вы не создавали - у вас просто объявлено поле этого типа в ресивере. да вы и не можете его создать - его создает система при переходе к активити. на случай если вы настойчивы и изворотливы - не пытайтесь в onCreate сохранить this в статик поле ресивера что бы потом из него кинуть текст в активити - это ничем хорошим не закончится - активити может к тому времени уже быть уничтожена. ознакомьтесь с жизненным циклом активити на официальном сайте есть хорошие картинки
0
svd_sergey
1 / 1 / 0
Регистрация: 14.08.2012
Сообщений: 84
28.01.2017, 18:42  [ТС] #3
А можете подсказать, как вывести этот текст иным образом? Просто я только начинаю изучение программирования на андроиде.
0
Kir-malishev
71 / 71 / 57
Регистрация: 07.08.2016
Сообщений: 173
28.01.2017, 18:47 #4
Может быть сделать внутренний класс?

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
public class MainActivity extends Activity implements View.OnClickListener{
     
    Button btnSend;
    TextView tvStatus, tvResult;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        btnSend = (Button) findViewById(R.id.btnSend);
        btnSend.setOnClickListener(this);
 
        tvStatus = (TextView) findViewById(R.id.tvStatus);
        tvResult = (TextView) findViewById(R.id.tvResult);
    }
 
    public void showText(String text){
        tvResult.setText(text);
    }
    
    private class SmsReceiver extends BroadcastReceiver {
         
        public static final String SMS_BUNDLE = "pdus";
        private String smsResult = "";
     
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle intentExtras = intent.getExtras();
            if(intentExtras != null) {
                Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
                String smsMessageStr = "";
                String dateText = "";
     
                /**Получаем текст сообщения*/
                for(int i = 0; i < sms.length; i++) {
                    SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);
     
                    String smsBody = smsMessage.getMessageBody().toString();
                    //String address = smsMessage.getOriginatingAddress();
                    long timeMillis = smsMessage.getTimestampMillis();
     
                    Date date = new Date(timeMillis);
                    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yy");
                    dateText = format.format(date);
     
                    smsMessageStr += smsBody;
                }
                /**Приписываем дату сообщения*/
                smsResult = dateText + ": " + smsMessageStr;
     
                /**Вывод*/
                Toast.makeText(context, smsResult, Toast.LENGTH_LONG).show();
                showText(smsResult);
            }
        }
    }
}
0
svd_sergey
1 / 1 / 0
Регистрация: 14.08.2012
Сообщений: 84
28.01.2017, 19:21  [ТС] #5
Если делать так, как написано выше, то в манифесте появляется ошибка, что класс не public. (Изменил название класса на Sms, чтоб не удалять файл класса). Привожу код манифеста:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".MainActivity$Sms"
            android:exported="true">
            <intent-filter android:priority="999" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>
Написал так (исправил private на public):
MainActivity.java:
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
Button btnSend;
    TextView tvStatus, tvResult;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        btnSend = (Button) findViewById(R.id.btnSend);
        btnSend.setOnClickListener(this);
 
        tvStatus = (TextView) findViewById(R.id.tvStatus);
        tvResult = (TextView) findViewById(R.id.tvResult);
    }
 
    /**Отправка USSD-запроса*/
    @Override
    public void onClick(View v) {
        String encodedHash = Uri.encode("#");
        String ussd = "*155*0" + encodedHash;
        startActivityForResult(new Intent("android.intent.action.CALL", Uri.parse("tel:" + ussd)), 1);
 
        tvStatus.setText("Запрос отправлен. Ждем ответ...");
    }
 
    public void showText(String text){
        tvResult.setText(text);
    }
 
    public class Sms extends BroadcastReceiver{
 
        public static final String SMS_BUNDLE = "pdus";
        private String smsResult = "";
 
        @Override
        public void onReceive(Context context, Intent intent) {
            Bundle intentExtras = intent.getExtras();
            if(intentExtras != null) {
                Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
                String smsMessageStr = "";
                String dateText = "";
 
                /**Получаем текст сообщения*/
                for(int i = 0; i < sms.length; i++) {
                    SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);
 
                    String smsBody = smsMessage.getMessageBody().toString();
                    //String address = smsMessage.getOriginatingAddress();
                    long timeMillis = smsMessage.getTimestampMillis();
 
                    Date date = new Date(timeMillis);
                    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yy");
                    dateText = format.format(date);
 
                    smsMessageStr += smsBody;
                }
                /**Приписываем дату сообщения*/
                smsResult = dateText + ": " + smsMessageStr;
 
                /**Вывод*/
                Toast.makeText(context, smsResult, Toast.LENGTH_LONG).show();
                showText(smsResult);
            }
        }
    }
Ошибки:
java.lang.RuntimeException: Unable to instantiate receiver com.example.svd_serg.alenaapp.MainActivity$Sms: java.lang.InstantiationException: class com.example.svd_serg.alenaapp.MainActivity$Sms has no zero argument constructor
0
Kir-malishev
71 / 71 / 57
Регистрация: 07.08.2016
Сообщений: 173
28.01.2017, 19:33 #6
Попробуйте сделать его static.

http://stackoverflow.com/questions/3...-zero-argument
0
svd_sergey
1 / 1 / 0
Регистрация: 14.08.2012
Сообщений: 84
28.01.2017, 19:43  [ТС] #7
Так подчеркивает вызов функции showText: Non-static method 'showText(java.lang.String)' cannot be referenced from a static context.
0
vxg
Модератор
3246 / 2047 / 322
Регистрация: 13.01.2012
Сообщений: 7,926
29.01.2017, 10:02 #8
svd_sergey, предлагаю начать с краткого изложения темы что нужно сделать
0
29.01.2017, 10:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2017, 10:02

Корректное выделение метода в отдельный сервис и обращение к нему из другого класса
Всем привет. Я извиняюсь, вопрос покажется новичковым, но все таки еще путаюсь...

Как изменить Textview из другого класса (класса адаптера RecyclerView)
У меня есть список RecyclerView тоесть этот файл Basket и файл что реализует...

Вызов метода в onCreate()
Здравствуйте.Пытаюсь загружать сохраненные данные при старте приложения и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru