Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 17 окт 2018, 23:19

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Урок 27. Читаем action из Intent
СообщениеДобавлено: 25 авг 2017, 15:12 

Зарегистрирован: 03 янв 2014, 14:28
Сообщений: 32
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Tinky-Winky писал(а):
Ответ на вопрос пользователя "compl"

День добрый и вам
Постараюсь ответить на ваш вопрос в свете личного понимания.
Поскольку при разработке мы используем синтаксис языка java(для файлов nameApp.java),то и базовые понятия должны соответствовать этому синтаксису.

Не много теории.

equals это - операция сравнения содержимого соответствующих переменным областям памяти

== это - операция сравнения ссылок.

В чём разница?

метод equals(Object) класса java.lang.Object
сравнивает содержимое двух областей памяти

== операция сравнения двух ссылок на объекты. Т.е. эта операция вернет true тогда и только тогда, когда содержимое совпадает, что означает, что переменные указывают на ОДИН И ТОТ ЖЕ объект.

Что касается вашего случая то здесь есть маленький нюанс.
Одинаковые строки на самом деле являются единственным объектом. В чем легко убедиться, выполнив следующий код:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. String str1 = "string";
  2. String str2 = "string";
  3. System.out.println(str1==str2 ? "the same" : "not the same");
  4.  


Результатом будет "the same". Что означает, что ссылки на строки равны. Это сделано на уровне компилятора, очевидно, для экономии памяти. Компилятор создает ОДИН экземпляр строки, и присваивает str1 и str2 ссылку на этот экземпляр.

Однако, это относится только к строкам, объявленным как литералы, в коде. Если скомпоновать строку из кусков, ссылка на нее будет другой. Подтверждение – данный пример:

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.  
  2.  String str1 = "string";
  3. String str2 = "str";
  4. String str3 = "ing";
  5. System.out.println(str1==(str2+str3) ? "the same" : "not the same");
  6.  

Результатом будет "not the same". Также можно создать новый объект с помощью копирующего конструктора:

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.  String str1 = "string";
  2. String str2 = new String("string");
  3. System.out.println(str1==str2 ? "the same" : "not the same");
  4.  

Результатом также будет "not the same".

Таким образом, иногда строки можно сравнивать и через сравнение ссылок. Но на это лучше не полагаться.
При объяснении использованы материалы из сайта(http://www.skipy.ru)

Надеюсь смог помочь


Java объектно-ориентированный и кроме примитивных типов все в Java - это классы.
Возможно в компилятор встроена определенная оптимизация, но с точки зрения теории
Str1 = "строка1";
Str2 = "строка1";

это тоже само что
Str1 = new String("строка1");
Str2 = new String("строка2");

т.е. 2 разных объекта и указатели на них будут разные.
Если предположить, что Str1 == Str2, т.е. указатель для них указывает на одну область памяти, тогда при изменении в Str1 значения автоматически поменяется и в Str2.

но в спецификации к языку есть такое понятие, как пул строк. и в определенных случаях указатели двух переменных будут указывать на одну область памяти.
как этот пул строиться, не могу сказать, внимательно не читал, но надеяться на такое сравнение я бы не стал.
Для класса String переопределен метод equals, при вызове которого этот метод выполняет посимвольное сравнение и возвращает true или false, т.е. не выполняет сравнение указателей,а сравнивает именно строку.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 27. Читаем action из Intent
СообщениеДобавлено: 08 авг 2018, 15:51 

Зарегистрирован: 08 авг 2018, 07:26
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Здравствуйте!
Прежде чем опишу проблему, выдам своих исходники по уроку. Работаю в android studio 3.1.3
XML
Activity_main
Код: [ Загрузить ] [ Скрыть ]
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout 
  3.     xmlns:android="http://schemas.android.com/apk/res/android" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     android:orientation="vertical" 
  7.     android:background="#000000"> 
  8.  
  9.  
  10.     <Button 
  11.         android:layout_width="match_parent" 
  12.         android:layout_height="wrap_content" 
  13.         android:text="ShowTime" 
  14.         android:id="@+id/Button1" /> 
  15.  
  16.     <Button 
  17.         android:layout_width="match_parent" 
  18.         android:layout_height="wrap_content" 
  19.         android:text="ShowDate" 
  20.         android:id="@+id/Button2"/> 
  21.  
  22. </LinearLayout> 

Activity_main2
Код: [ Загрузить ] [ Скрыть ]
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout 
  3.     xmlns:android="http://schemas.android.com/apk/res/android" 
  4.     android:layout_width="fill_parent" 
  5.     android:layout_height="fill_parent" 
  6.     android:orientation="vertical"> 
  7.      
  8.     <TextView 
  9.         android:layout_width="wrap_content" 
  10.         android:layout_height="wrap_content" 
  11.         android:text="TextView" 
  12.         android:id="@+id/TextViewId" 
  13.         android:textSize="50sp" 
  14.         android:layout_marginTop="30dp" 
  15.         android:layout_gravity="center_horizontal"/> 
  16.  
  17. </LinearLayout> 

Activity_main3

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:id="@+id/TextViewId"
android:textSize="50sp"
android:layout_marginTop="30dp"
android:layout_gravity="center_horizontal"/>

</LinearLayout>


Классы
MainActivity
Код: [ Загрузить ] [ Скрыть ]
  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.  
  8.         Button time = (Button) findViewById(R.id.Button1); 
  9.         Button date = (Button) findViewById(R.id.Button2); 
  10.         time.setOnClickListener(this); 
  11.         date.setOnClickListener(this); 
  12.  
  13.     } 
  14.  
  15.     @Override 
  16.     public void onClick(View view) { 
  17.         Intent intent = null; 
  18.         switch (view.getId()){ 
  19.             case R.id.Button1: 
  20.                 intent = new Intent("MyUserTime"); 
  21.                 startActivity(intent); 
  22.             break; 
  23.             case R.id.Button2: 
  24.                 intent = new Intent("MyUserData"); 
  25.                 startActivity(intent); 
  26.             break; 
  27.         } 
  28.     } 

Main2Activity
Код: [ Загрузить ] [ Скрыть ]
  1. public class Main2Activity extends AppCompatActivity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main2); 
  7.         Intent intent = getIntent(); 
  8.         String action = intent.getAction(); 
  9.         String format ="", textInfo = ""; 
  10.  
  11.         if (action.equals("MyUserTime")){ 
  12.             format = "HH:mm:ss"; 
  13.             textInfo = "Time: "; 
  14.         } else if (action.equals("MyUserData")){ 
  15.             format = "dd.MM.yyyy"; 
  16.             textInfo = "Date: "; 
  17.         } 
  18.  
  19.         SimpleDateFormat sdf = new SimpleDateFormat(format); 
  20.         String datetime = sdf.format(new Date(System.currentTimeMillis())); 
  21.  
  22.         TextView tvDate = (TextView) findViewById(R.id.TextViewId); 
  23.         tvDate.setText("Main2Activity: " + textInfo + datetime); 
  24.     } 
  25.  

Main3Activity
Код: [ Загрузить ] [ Скрыть ]
  1. public class Main2Activity extends AppCompatActivity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main2); 
  7.         Intent intent = getIntent(); 
  8.         String action = intent.getAction(); 
  9.         String format ="", textInfo = ""; 
  10.  
  11.         if (action.equals("MyUserTime")){ 
  12.             format = "HH:mm:ss"; 
  13.             textInfo = "Time: "; 
  14.         } else if (action.equals("MyUserData")){ 
  15.             format = "dd.MM.yyyy"; 
  16.             textInfo = "Date: "; 
  17.         } 
  18.  
  19.         SimpleDateFormat sdf = new SimpleDateFormat(format); 
  20.         String datetime = sdf.format(new Date(System.currentTimeMillis())); 
  21.  
  22.         TextView tvDate = (TextView) findViewById(R.id.TextViewId); 
  23.         tvDate.setText("Main2Activity: " + textInfo + datetime); 
  24.     } 

Манифест
Цитата:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.smarthouseapplication.ms.myapplication">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
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>
<activity
android:name=".Main2Activity"
android:label="Activity one">
<intent-filter>
<action android:name="MyUserTime" />
<action android:name="MyUserDate" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".Main3Activity"
android:label="Activity two">
<intent-filter>
<action android:name="MyUserTime" />
<action android:name="MyUserDate" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>

</manifest>


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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB