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

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

28.01.2017, 16:51. Просмотров 375. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вызов метода из другого класса (Программирование Android):

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

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

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

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

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

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

7
vxg
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
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
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
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()
Здравствуйте.Пытаюсь загружать сохраненные данные при старте приложения и...

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

Вызов java метода из native
Привет, чтот не пойму зачем у меня ошибка происходит... Значит что хочу и...


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

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

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