Tools context mainactivity ошибка

the argument: tools:context=".MainActivity" gives me error, addly the part named: .MainActivity appears in color red, what can i do? xmlns:android="http://schemas.android.com/apk/res/android" xmlns:

the argument: tools:context=".MainActivity" gives me error, addly the part named: .MainActivity appears in color red, what can i do?

xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"

Alec's user avatar

Alec

7,9688 gold badges34 silver badges61 bronze badges

asked Apr 20, 2019 at 22:14

Daniel Mauricio Bernal Arias's user avatar

1

tried rebuild project or try invalidate cache restart

if still same problem you can add yourpackagename.mainactivity
like in the picture this

tools:context="com.etest.myapplicwr.MainActivity">

my packgae name is com.etest.myapplicwr
replace it with your package name

answered Aug 24, 2020 at 14:22

bart mine's user avatar

You can delete it, or you can update it to point to some activity or fragment where you will be using this layout resource.

answered Apr 20, 2019 at 22:16

CommonsWare's user avatar

CommonsWareCommonsWare

975k189 gold badges2361 silver badges2437 bronze badges

you should find which folder save your MainActivity.
For Example:enter image description here
So, Check it.

And then, you should understand what’s its function.

it is used by: Lint, Android Studio layout editor .

This attribute declares which activity this layout is associated with by default.

This enables features in the editor or layout preview that require knowledge of the activity, such as what the layout theme should be in the preview and where to insert onClick handlers when you make those from a quickfix.

you can find more information here

answered Apr 21, 2019 at 5:25

Longalei's user avatar

LongaleiLongalei

4233 silver badges8 bronze badges

Я столкнулся с проблемой при использовании Android Studio. Когда я пытаюсь запустить какое-либо приложение, я получаю ту же ошибку » tools:context=".MainActivity" умолчанию не найдено», и в моем коде в строке tools:context=".MainActivity", MainActivity выделяется красным цветом и говорит «Unresolved class MainActivity». Это происходит, даже если я создаю совершенно новую «пустую активность».

Пока что я пробовал:

  • обновление кеша IDE
  • проверенные имена пакетов в манифесте Android и MainActivity
  • выбор активности по умолчанию в конфигурации приложения
  • убедился, что src является исходным каталогом

Я также заметил, что в моем «самом продвинутом» приложении build.gradle выглядит так:

Изображение 417888

Android манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.justjava">

    <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>
    </application>

</manifest>

Каталог проекта + код:

Изображение 417895

основной вид деятельности xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/coffee_grains"
        android:layout_width="match_parent"
        android:layout_height="300sp"
        android:contentDescription="Coffee Grains"
        android:scaleType="centerCrop"
        android:src="@drawable/coffee_grains"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@+id/cup"
        android:layout_width="120sp"
        android:layout_height="170sp"
        android:layout_marginLeft="8dp"
        android:src="@drawable/cup"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/coffee_grains" />

    <TextView
        android:id="@+id/quantity"
        android:layout_width="100sp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16sp"
        android:layout_marginTop="16sp"
        android:gravity="center"
        android:text="quantity"
        android:textAllCaps="true"
        android:textSize="16sp"
        app:layout_constraintLeft_toRightOf="@id/cup"
        app:layout_constraintTop_toBottomOf="@id/coffee_grains" />

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintLeft_toRightOf="@id/cup"
        app:layout_constraintTop_toBottomOf="@id/quantity">

        <Button
            android:id="@+id/plus"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_marginLeft="8dp"
            android:onClick="increment"
            android:text="+" />

        <TextView
            android:id="@+id/quantity_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8sp"
            android:layout_marginRight="8sp"
            android:gravity="center"
            android:text="1"
            android:textColor="#000000"
            android:textSize="14sp" />

        <Button
            android:id="@+id/miuns"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:layout_marginLeft="8dp"
            android:onClick="decrement"
            android:text="-" />
    </LinearLayout>

    <TextView
        android:id="@+id/price"
        android:layout_width="100sp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="8dp"
        android:gravity="center"
        android:text="order summary"
        android:textAllCaps="true"
        android:textSize="16sp"
        app:layout_constraintLeft_toRightOf="@id/cup"
        app:layout_constraintTop_toBottomOf="@id/linearLayout" />

    <TextView
        android:id="@+id/order_summary_text_view"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="8dp"
        android:gravity="center"
        android:text="0$"
        android:textSize="16dp"
        app:layout_constraintLeft_toRightOf="@id/cup"
        app:layout_constraintTop_toBottomOf="@id/price" />

    <Button
        android:layout_width="100sp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16sp"
        android:layout_marginTop="8sp"
        android:gravity="center"
        android:onClick="submitOrder"
        android:text="order"
        android:textSize="16sp"
        app:layout_constraintLeft_toRightOf="@id/cup"
        app:layout_constraintTop_toBottomOf="@id/order_summary_text_view" />
</android.support.constraint.ConstraintLayout>

Основной файл активности:

package com.example.justjava;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;

/**
 * This app displays an order form to order coffee.
 */
public class MainActivity extends AppCompatActivity {

    int quantity = 1;
    double pricePerCup = 2.90;
    String name = "Pawel";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void increment(View view) {
        quantity = quantity +1;
        displayQuantity(quantity);
    }
    public void decrement(View view) {
        quantity = quantity - 1;
        displayQuantity(quantity);
    }
    private String createOrderSummary(double price){
        String orderSummary = "Name: " + name + "nQuantity: " + quantity + 
    "nTotal price: $" + price + "nThanks!";
        return orderSummary;
    }

    private double calculatePrice(int count, double price){
        return count*price;
    }

    /**
     * This method displays the given text on the screen.
     */
    private void displayMessage(String message) {
        TextView orderSummaryTextView = 
    findViewById(R.id.order_summary_text_view);
        orderSummaryTextView.setText(message);
    }
    /**
     * This method is called when the order button is clicked.
     */
    public void submitOrder(View view) {
        double totalPrice = calculatePrice(quantity, pricePerCup);
        String priceMessage = createOrderSummary(totalPrice);
        displayMessage(priceMessage);
    }

    /**
     * This method displays the given quantity value on the screen.
     */
    private void displayQuantity(int number) {
        TextView quantityTextView = findViewById(R.id.quantity_text_view);
        quantityTextView.setText("" + number);
    }

}

#java #android #xml #android-studio

Вопрос:

В моем файле AndroidManifest отображается ошибка «Неразрешенный класс «MainActivity»», но у меня есть класс java и файл с таким именем в пакете , и он должен быть первым действием программы, поэтому, когда я пытаюсь запустить программу, она выходит из строя, я проверил свой код, но не смог найти там никаких проблем .

java-код для файла MainActivity

 package com.example.tictactoe;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
import android.content.Intent;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    Button forward;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        forward = (Button)findViewById(R.id.start);
        forward.setOnClickListener(new View.OnClickListener()
                                    {
                                       @Override
                                       public void onClick(View v)
                                       {
                                           startActivity(new Intent(MainActivity.this,GameUi.class));
                                       }
                                    });
    }
    @Override
    public void onBackPressed() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setCancelable(false);
        builder.setMessage("Do you want to Exit?");
        builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        builder.setNegativeButton("No",new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });
        AlertDialog alert=builder.create();
        alert.show();
    }
}
 

java-код для второго действия, которое использует моя программа («GameUi.java»)

 package com.example.tictactoe

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.os.Bundle;

public class GameUi extends AppCompatActivity {
    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game_ui);
        btn=(Button)findViewById(R.id.backbtn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    startActivity(new Intent(GameUi.this, MainActivity.class));
            }
        });
    }
}
 

AndroidManifest file code

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tictactoe">

    <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/Theme.TicTacToe">
        <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=".GameUi">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

Код xml-файла основной активности

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#E5E6AD"
        tools:context=".MainActivity">
    <TextView
        android:id="@ id/Heading"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_row="0"
        android:layout_column="0"
        android:layout_marginBottom="332dp"
        android:editable="false"
        android:text="Hello Aliens!"
        android:textAlignment="center"
        android:textColor="#000000"
        android:textSize="50dp"
        android:textStyle="bold|italic"
        app:layout_constraintBottom_toBottomOf="parent"
        tools:layout_editor_absoluteX="16dp" />

    <ImageView
        android:id="@ id/Alienimg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="36dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@id/Heading"
        app:srcCompat="@drawable/ic_launcher_foreground" />
    
    <Button
        android:id="@ id/Startbtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#000066"
        android:letterSpacing="0.5"
        android:padding="0dp"
        android:text="Start"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/Alienimg"
        app:layout_constraintVertical_bias="0.886" />

</androidx.constraintlayout.widget.ConstraintLayout>
 

введите описание изображения здесь

Комментарии:

1. Вставьте свою ошибку logcat при сбое приложения.

2. пожалуйста, вставьте activity_main.xml

3. Файл (Верхнее меню) -> Аннулировать кэш / перезапустить. Это должно решить вашу проблему

Ответ №1:

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

 package com.example.tictactoe;
 

Комментарии:

1. На самом деле я добавил файлы в пакет , который я пропустил, чтобы показать это на stackoverflow, Извините, что я исправил это сейчас.

Ответ №2:

Это является причиной ошибки

 <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=".GameUi">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

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

В случае, если основная активность-это ваше первое действие

 <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=".GameUi">
            
        </activity>

 

Комментарии:

1. Я так не думаю. это проблема, верно. но это просто делает два приложения, которые открываются в разных видах деятельности.

2. Это не причина сбоя, я проверил это в своем приложении, работает.

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

4. @Паста Ачинтяшарма activity_main.xml

Ответ №3:

Ваш манифест в порядке ( я думаю, вы исправили проблему с фильтром намерений на основе ответа Абдуллы Шейха). проблема заключается в том, что эта строка в MainActivity :

     forward = (Button)findViewById(R.id.start);
 

потому что ваш идентификатор кнопки Startbtn не start

просто замените это на :

 forward = (Button)findViewById(R.id.Startbtn);
 

также в activity_main и ImageView удалите

app:srcCompat="@drawable/ic_launcher_foreground"

или найдите другой src для рисования.

Привет, новичок в студии Android, и я получаю эту ошибку, может кто-нибудь помочь. Я не могу понять, как именно решить эту ошибку. он говорит, что MainActivity — это неразрешенный класс

Файл activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.andriod.justjava.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="QUANTITY"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/quantity_text_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="16dp"
            android:text="0"
            android:textColor="@android:color/black"
            android:textSize="16sp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Price"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/price_text_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="16dp"
            android:text="$0"
            android:textColor="@android:color/black"
            android:textSize="16sp" />

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="submitOrder"
            android:text="Order" />

    </LinearLayout>

</android.support.constraint.ConstraintLayout>

Ошибка отображается в

`    tools:context="com.example.andriod.justjava.MainActivity">
`

Спасибо за вашу помощь!

2 ответа

Не уверен, что это так, но вы неправильно написали «android»:

tools:context="com.example.andriod.justjava.MainActivity"


1

Mike
4 Янв 2018 в 05:42

Эта проблема возникает при неправильном названии пакета? Попробуй поменять.

Или вы добавляете это действие в файл манифеста?

.

MyLearningApps

Android Studio: Fixing Errors

Changing From Empty To Blank Activity

The first three template activities shown in the Android Studio New Project Wizard are “No Activity”, “Blank Activity” and “Empty Activity”.

In simple words, “Activity” is a screen that you see on Android Device.

“Empty Activity” provides basic files to start the project with minimum codes.

“Blank Activity” adds option menu and floating bar to the project.

This tutorial will help you to manually build a Blank Activity project from Empty Activity project.

You will encounter a number of errors throughout the steps. Follow the guides to fix them one by one.

Most of the beginners do not like to see errors but in reality you can’t escape from it. So, be prepared to face and fix them!

1) Startup

2) Create an additional layout.

Create a new layout file, content_main.xml

Move the content of activity_main.xml to content_main.xml

File Name: content_main.xml

<?xml version=«1.0» encoding=«utf-8»?>

<RelativeLayout xmlns:android=«http://schemas.android.com/apk/res/android»

   xmlns:tools=«http://schemas.android.com/tools«

    xmlns:app=«http://schemas.android.com/apk/res-auto»

   android:layout_width=«match_parent»

   android:layout_height=«match_parent»

   android:paddingLeft=«@dimen/activity_horizontal_margin»

   android:paddingRight=«@dimen/activity_horizontal_margin»

   android:paddingTop=«@dimen/activity_vertical_margin»

   android:paddingBottom=«@dimen/activity_vertical_margin»

   app:layout_behavior=«@string/appbar_scrolling_view_behavior»

   tools:context=«.MainActivity»>

   <TextView android:text=«Hello World!»

       android:layout_width=«wrap_content»

       android:layout_height=«wrap_content» />

</RelativeLayout>

3) Edit activity_main.xml

Put the following codes to activity_main.

File Name: activity_main.xml

<?xml version=«1.0» encoding=«utf-8»?>

<android.support.design.widget.CoordinatorLayout

   xmlns:android=«http://schemas.android.com/apk/res/android»

   xmlns:app=«http://schemas.android.com/apk/res-auto»

   xmlns:tools=«http://schemas.android.com/tools» android:layout_width=«match_parent»

   android:layout_height=«match_parent» android:fitsSystemWindows=«true»

   tools:context=«.MainActivity»>

   <android.support.design.widget.AppBarLayout android:layout_height=«wrap_content»

       android:layout_width=«match_parent»android:theme=«@style/AppTheme.AppBarOverlay»>

       <android.support.v7.widget.Toolbar android:id=«@+id/toolbar»

           android:layout_width=«match_parent» android:layout_height=«?attr/actionBarSize»

           android:background=«?attr/colorPrimary»app:popupTheme=«@style/AppTheme.PopupOverlay» />

   </android.support.design.widget.AppBarLayout>

   <include layout=«@layout/content_main» />

   <android.support.design.widget.FloatingActionButton android:id=«@+id/fab»

       android:layout_width=«wrap_content» android:layout_height=«wrap_content»

       android:layout_gravity=«bottom|end» android:layout_margin=«@dimen/fab_margin»

       android:src=«@android:drawable/ic_dialog_email» />

</android.support.design.widget.CoordinatorLayout>

4) Edit MainActivity.java

Turn on “Show Line Numbers” to help you identify each line easily.

Your original MainActivity.java contains the following codes:

public class MainActivity extends AppCompatActivity {

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

   }

}

We will add additional codes to the section shown below. Pay attention to the line to avoid mistakes.

Your edited MainActivity.java should look like below:

public class MainActivity extends AppCompatActivity {

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

       setSupportActionBar(toolbar);

       FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

       fab.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View view) {

               Snackbar.make(view, «Replace with your own action», Snackbar.LENGTH_LONG)

                       .setAction(«Action»null).show();

           }

       });

   }

   @Override

   public boolean onCreateOptionsMenu(Menu menu) {

       // Inflate the menu; this adds items to the action bar if it is present.

       getMenuInflater().inflate(R.menu.menu_main, menu);

       return true;

   }

   @Override

   public boolean onOptionsItemSelected(MenuItem item) {

       // Handle action bar item clicks here. The action bar will

       // automatically handle clicks on the Home/Up button, so long

       // as you specify a parent activity in AndroidManifest.xml.

       int id = item.getItemId();

       //noinspection SimplifiableIfStatement

       if (id == R.id.action_settings) {

           return true;

       }

       return super.onOptionsItemSelected(item);

   }

}

Android Studio will automatically detect the libraries needed by your codes.

However, there are situations where some codes could not be recognized.

It could be that the existing libraries do not support the codes.

5) Edit build.gradle (Module:app)

You need to add additional module to support the new codes.

File Name: build.gradle (Module:app)

apply plugin‘com.android.application’

android {

   compileSdkVersion 23

   buildToolsVersion «23.0.1»

   defaultConfig {

       applicationId «com.notarazi.mylearningapps1»

       minSdkVersion 14

       targetSdkVersion 23

       versionCode 1

       versionName «1.0»

   }

   buildTypes {

       release {

           minifyEnabled false

           proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’

       }

   }

}

dependencies {

   compile fileTree(dir‘libs’include: [‘*.jar’])

   testCompile ‘junit:junit:4.12’

   compile ‘com.android.support:appcompat-v7:23.1.0’

   compile ‘com.android.support:design:23.1.0’

}

6) Synchronize project

Click “Sync Now” button to synchronize the project codes after the new module has been added.

7) Fixing Errors

Find the red colored codes in MainActivity.java, click the text and press ALT+ENTER.

If the new module supports your code, Android Studio should be able to recommend cod fixes.

Select the “import class” option.

Now, some errors are gone. But you still get error for R.

This error suggests that there could be problems with Resource files. It could be originating from activity_main.

Open the file to seek more clues.

If you type ALT+ENTER, you may get a recommendation to add a style value.

Open the style value file , res/values/styles.xml

We may need to add more definition here in order to fix the error.

Edit the file as follows

File Name: res/values/styles.xml

<resources>

   <!— Base application theme. —>

   <style name=«AppTheme» parent=«Theme.AppCompat.Light.DarkActionBar»>

       <!— Customize your theme here. —>

       <item name=«colorPrimary»>@color/colorPrimary</item>

       <item name=«colorPrimaryDark»>@color/colorPrimaryDark</item>

       <item name=«colorAccent»>@color/colorAccent</item>

   </style>

   <style name=«AppTheme.NoActionBar»>

       <item name=«windowActionBar»>false</item>

       <item name=«windowNoTitle»>true</item>

   </style>

   <style name=«AppTheme.AppBarOverlay» parent=«ThemeOverlay.AppCompat.Dark.ActionBar»/>

   <style name=«AppTheme.PopupOverlay» parent=«ThemeOverlay.AppCompat.Light» />

</resources>

Every time you change codes, make a practice to clean your codes.

Go to menu, select Build/Clean Project.

Check if there is some more errors to fix.

File Name: res/values/dimens.xml

<resources>

   <!— Default screen margins, per the Android Design guidelines. —>

   <dimen name=«activity_horizontal_margin»>16dp</dimen>

   <dimen name=«activity_vertical_margin»>16dp</dimen>

   <dimen name=«fab_margin»>16dp</dimen>

</resources>

Any more errors?

You need to create a new folder “menu” under “res”.

And then add definitions for menu_main.

File Name: res/menu/menu_main.xml

<menu xmlns:android=«http://schemas.android.com/apk/res/android»

   xmlns:app=«http://schemas.android.com/apk/res-auto»

   xmlns:tools=«http://schemas.android.com/tools» tools:context=«.MainActivity»>

   <item android:id=«@+id/action_settings» android:title=«@string/action_settings»

       android:orderInCategory=«100» app:showAsAction=«never» />

</menu>

Any more errors?

File Name: res/values/strings.xml

<resources>

   <string name=«app_name»>MyLearningApps1</string>

   <string name=«action_settings»>Settings</string>   

</resources>

If you manage to fix all of the above errors, you code would at last be error-free.

Run your project to see the outcome.

Read the “error” log messages.

Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.

At this stage, your code-fixing process becomes more challenging.

You need to figure out something based on the error message given by the device.

Some times, prior experiences or knowledge sharing in Stack Exchange Forum may be helpful.

One of the solution is to edit your manifest file.

File Name: AndroidManifest.xml

<?xml version=«1.0» encoding=«utf-8»?>

<manifest xmlns:android=«http://schemas.android.com/apk/res/android»

   package=«com.notarazi.mylearningapps1» >

   <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»

           android:theme=«@style/AppTheme.NoActionBar» >

           <intent-filter>

               <action android:name=«android.intent.action.MAIN» />

               <category android:name=«android.intent.category.LAUNCHER» />

           </intent-filter>

       </activity>

   </application>

</manifest>

DOWNLOAD:

.

Vavi

1 / 1 / 1

Регистрация: 06.08.2013

Сообщений: 16

1

09.01.2014, 22:35. Показов 2000. Ответов 10

Метки нет (Все метки)


Начал изучать Java и написание под Андроид. Eclipse с модулем имеется.
Простая программка: ToggleButton, от состояния которого меняется текст в текстовой вьюхе. Делал по урокам, приложение запускается, текст не выводится, где я накосячил?
active_main.xml

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
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
 
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
 
    <ToggleButton
        android:id="@+id/toggleButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" />
 
    <TextView
        android:id="@+id/tvInfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/toggleButton1"
        android:layout_alignRight="@+id/toggleButton1"
        android:layout_marginBottom="29dp" />
 
</RelativeLayout>

Сам класс ToggleButtonDemoActivity.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
package com.example.testxxxx;
 
import android.app.Activity;
import android.os.Bundle;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
 
public class ToggleButtonDemoActivity extends Activity implements
        OnCheckedChangeListener {
 
    ToggleButton toogleButton;
    TextView tvInfo;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toogleButton = (ToggleButton) findViewById(R.id.toggleButton1);
        tvInfo = (TextView) findViewById(R.id.tvInfo);
 
        toogleButton.setOnCheckedChangeListener(this);
    }
 
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // TODO Auto-generated method stub
        if (isChecked)
            tvInfo.setText("Состояние: Включён");
        else
            tvInfo.setText("Состояние: Выключен");
    }
}

Только учусь, поэтому буду рад всем замечаниям

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



verylazy

Заблокирован

09.01.2014, 22:56

2

недоглядел, ответ стер

Добавлено через 10 минут
создал у себя, запустил, все работает
показывает кнопку и нажимается



0



1 / 1 / 1

Регистрация: 06.08.2013

Сообщений: 16

09.01.2014, 23:01

 [ТС]

3

Цитата
Сообщение от verylazy
Посмотреть сообщение

Добавлено через 10 минут
создал у себя, запустил, все работает
показывает кнопку и нажимается

Хм, странно. Может у меня эмулятор бунтует. Сейчас проверю на смартфоне

Добавлено через 52 секунды

Цитата
Сообщение от verylazy
Посмотреть сообщение

Добавлено через 10 минут

показывает кнопку и нажимается

Кнопка должна те только нажиматься, но и в текстовом поле должна выводиться информация. onCheckedChanged событие



0



2 / 2 / 0

Регистрация: 26.09.2013

Сообщений: 13

10.01.2014, 00:02

4

не ломайте голову. попробуйте сначала фон закрасить у активити или у вьюхи и все получится. Сам спотыкался на этом моменте.
Если вы на разметку без фона установите вьюшку для карт и оставите поля то при перетаскивании карты на полях будут кракозябры. А также если на незакрашенной активити есть кнопка внизу, то при вызове клавиатуры она переместится выше а после того как спрячете клаву увидите аж два изображения кнопки — одну на положенном месте — настоящую, другую там куда она перемещалась — артефакт.
И вообще совет для начинающих: создали разметку и сразу закрасили фон, избавит от лишних вопросов.



0



1 / 1 / 1

Регистрация: 06.08.2013

Сообщений: 16

10.01.2014, 00:20

 [ТС]

5

Цитата
Сообщение от giperbol
Посмотреть сообщение

не ломайте голову. попробуйте сначала фон закрасить у активити или у вьюхи и все получится. Сам спотыкался на этом моменте.
Если вы на разметку без фона установите вьюшку для карт и оставите поля то при перетаскивании карты на полях будут кракозябры. А также если на незакрашенной активити есть кнопка внизу, то при вызове клавиатуры она переместится выше а после того как спрячете клаву увидите аж два изображения кнопки — одну на положенном месте — настоящую, другую там куда она перемещалась — артефакт.
И вообще совет для начинающих: создали разметку и сразу закрасили фон, избавит от лишних вопросов.

Спасибо за совет, но я не до конца его понял. Закрасить фон? Как? Зачем?
Класс не работает же. Вообще не понятно, реагирует ли ToggleButtonDemoActivity на происходящее с кнопкой или нет.



0



2 / 2 / 0

Регистрация: 26.09.2013

Сообщений: 13

10.01.2014, 01:32

6

Перед первым листингом название файла у Вас active_main.xml, а в коде класса вы вызываете activity_main.
Вот этот кусочек удалить tools:context=».MainActivity»

Вот готовый проект из Эклипса. 100% работает на реальных устройствах на андройд 2.2, 2.3.4 и 4.03.

Как закрасить фон — увидите в разметке строку

android:background= «@color/white»

Эта строка подразумевает, что в папке res/values имеется файл colors.xml а в нем описан цвет с названием white.



0



verylazy

Заблокирован

10.01.2014, 11:40

7

код рабочий на 100% все там меняется и нажимается и выводится
эмулятор вообще запускается? какая версия на эмутяторе, платформа?



0



1 / 1 / 1

Регистрация: 06.08.2013

Сообщений: 16

10.01.2014, 13:28

 [ТС]

8

Цитата
Сообщение от verylazy
Посмотреть сообщение

код рабочий на 100% все там меняется и нажимается и выводится
эмулятор вообще запускается? какая версия на эмутяторе, платформа?

Вот скрины эмулятор: и
С эмулятором все в порядке должно быть, ведь остальные проекты запускаются и работают.



0



verylazy

Заблокирован

10.01.2014, 13:40

9

файл с разметкой так и называется — activity_main.xml или все таки active_main.xml ?



0



1 / 1 / 1

Регистрация: 06.08.2013

Сообщений: 16

10.01.2014, 13:51

 [ТС]

10

Цитата
Сообщение от verylazy
Посмотреть сообщение

файл с разметкой так и называется — activity_main.xml или все таки active_main.xml ?

activity_main.xml
В коде правильно, ошибся при переносе

Добавлено через 4 минуты
Вот мой проект



0



2 / 2 / 0

Регистрация: 26.09.2013

Сообщений: 13

11.01.2014, 01:01

11

Значит так!
У Вас в проекте есть 2 активити MainActivity и ToggleButtonDemoActivity.
В файле манифеста объявлена только первая и она же является стартовой. Вызов Вашей разметки с кнопкой прописан и там и там, но поскольку запускается первая активити, то и реакции на кнопку нет, так как в коде первой активити ничего кроме вызова разметки. А кнопка в разметке есть и у нее 2 состояния гладить и не гладить (Привет Климову! Сам у него учился.). Поэтому при щелчке на кнопку сама кнопка изменяет свое состояние и больше ничего не происходит. Эмулятор у Вас в порядке.

Как исправить:
1 вариант — прописать код вызова второй активити в методе OnCreate у первой до вызова разметки. Не забываем при этом об объявлении второй активити в манифесте.
2 вариант — удалить из проекта первую активити и объявить в манифесте вторую сделав ее стартовой

Если и теперь непонятно, то просто в файле манифеста замените MainActivity на ToggleButtonDemoActivity и сразу все заработает!

Тему можно закрывать.



0



Приготовьте отладчик! Пишем приложение с ошибками, затем учимся их находить и дебажить

https://gbcdn.mrgcdn.ru/uploads/post/2735/og_image/ce05da5c8c8f97a3bf7713b7cbaf3802.png

Иногда в приложении встречаются ошибки, которые нельзя увидеть даже после запуска. Например, код компилируется, проект запускается, но результат далёк от желаемого: приложение падает или вдруг появляется какая-то ошибка (баг). В таких случаях приходится «запасаться логами», «брать в руки отладчик» и искать ошибки.

Часто процесс поиска и исправления бага состоит из трёх шагов:

  1. Воспроизведение ошибки — вы понимаете, какие действия нужно сделать в приложении, чтобы повторить ошибку.
  2. Поиск места ошибки — определяете класс и метод, в котором ошибка происходит.
  3. Исправление ошибки.

Если приложение не падает и чтение логов ничего не даёт, то найти точное место ошибки в коде помогает дебаггер (отладчик) — инструмент среды разработки.

    Чтобы посмотреть на логи и воспользоваться дебаггером, давайте напишем простое тестовое (и заведомо неправильное) приложение, которое даст нам все возможности для поиска ошибок.

    Это будет приложение, которое сравнивает два числа. Если числа равны, то будет выводиться результат «Равно», и наоборот. Начнём с простых шагов:

  1. Открываем Android Studio. 
  2. Создаём проект с шаблоном Empty Activity. 
  3. Выбираем язык Java, так как его, как правило, знают больше людей, чем Kotlin. 

Нам автоматически откроются две вкладки: activity_main.xml и MainActivity.java. Сначала нарисуем макет: просто замените всё, что есть в activity_main.xml, на код ниже:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context=".MainActivity">
 
  <EditText
     android:id="@+id/first_number_et"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:ems="10"
     android:gravity="center"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     app:layout_constraintTop_toTopOf="parent" />
 
  <EditText
     android:id="@+id/second_number_et"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:ems="10"
     android:gravity="center"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     app:layout_constraintTop_toBottomOf="@+id/first_number_et" />
 
  <Button
     android:id="@+id/button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="Равно?"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     app:layout_constraintTop_toBottomOf="@+id/second_number_et" />
 
  <TextView
     android:id="@+id/answer_tv"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text=""
     android:textSize="32sp"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     app:layout_constraintTop_toBottomOf="@+id/button" />
</androidx.constraintlayout.widget.ConstraintLayout>

Можете запустить проект и посмотреть, что получилось:

Теперь оживим наше приложение. Скопируйте в MainActivity этот код:

public class MainActivity extends AppCompatActivity {
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
 
     final Button button = (Button) findViewById(R.id.button);
     final EditText first = (EditText) findViewById(R.id.first_number_et);
     final EditText second = (EditText) findViewById(R.id.second_number_et);
     final TextView answer = (TextView) findViewById(R.id.answer_tv);
 
     button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           Integer firstInt = Integer.parseInt(first.getText().toString());
           Integer secondInt = Integer.parseInt(second.getText().toString());
           if (firstInt == secondInt) {
              answer.setText("Равно");
           } else {
              answer.setText("Равно");
           }
        }
     });
  }
}

В этом коде всё просто: 

  1. Находим поля ввода, поле с текстом и кнопку.
  2. Вешаем на кнопку слушатель нажатий.
  3. По нажатию на кнопку получаем числа из полей ввода и сравниваем их.
  4. В зависимости от результата выводим «Равно» или «Не равно».

Запустим приложение и введём буквы вместо чисел:

Нажмём на кнопку, и приложение упадёт! Время читать логи. Открываем внизу слева вкладку «6: Logcat» и видим:

Читать логи просто: нужно найти красный текст и прочитать сообщение системы. В нашем случае это java.lang.NumberFormatException: For input string: «f». Указан тип ошибки NumberFormatException, который говорит, что возникла какая-то проблема с форматированием числа. И дополнение: For input string: «f». Введено “f”. Уже можно догадаться, что программа ждёт число, а мы передаём ей символ. Далее в красном тексте видно и ссылку на проблемную строку: at com.example.appdebugging.MainActivity$1.onClick(MainActivity.java:26). Проблема в методе onClick класса MainActivity, строка 24. Можно просто кликнуть по ссылке и перейти на указанную строку:

int firstInt = Integer.parseInt(first.getText().toString());

Конечно, метод parseInt может принимать только числовые значения, но никак не буквенные! Даже в его описании это сказано — и мы можем увидеть, какой тип ошибки этот метод выбрасывает (NumberFormatException).

Здесь мы привели один из примеров. Типов ошибок может быть огромное количество, все мы рассматривать не будем. Но все ошибки в Logcat’е указываются по похожему принципу: 

  • красный текст;
  • тип ошибки — в нашем случае это NumberFormatException;
  • пояснение — у нас это For input string: «f»;
  • ссылка на строку, на которой произошла ошибка — здесь видим MainActivity.java:26. 

Исправим эту ошибку и обезопасим себя от некорректного ввода. Добавим в наши поля ввода android:inputType=»number», а остальной код оставим без изменений:

...
<EditText
  android:id="@+id/first_number_et"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:ems="10"
  android:gravity="center"
  android:inputType="number"
  app:layout_constraintLeft_toLeftOf="parent"
  app:layout_constraintRight_toRightOf="parent"
  app:layout_constraintTop_toTopOf="parent" />
 
<EditText
  android:id="@+id/second_number_et"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:ems="10"
  android:gravity="center"
  android:inputType="number"
  app:layout_constraintLeft_toLeftOf="parent"
  app:layout_constraintRight_toRightOf="parent"
  app:layout_constraintTop_toBottomOf="@+id/first_number_et" />
...

    Теперь можем вводить только числа. Проверим, как работает равенство: введём одинаковые числа в оба поля. Всё в порядке:

На равенство проверили. Введём разные числа: 

Тоже равно. То есть приложение работает, ничего не падает, но результат не совсем тот, который требуется. Наверняка вы и без дебаггинга догадались, в чём ошибка, потому что приложение очень простое, всего несколько строк кода. Но такие же проблемы возникают в приложениях и на миллион строк. Поэтому пройдём по уже известным нам этапам дебаггинга:

  1. Воспроизведём ошибку: да, ошибка воспроизводится стабильно с любыми двумя разными числами.
  2. Подумаем, где может быть ошибка: наверняка там, где сравниваются числа. Туда и будем смотреть.
  3. Исправим ошибку: сначала найдём её с помощью дебаггера, а когда поймём, в чём проблема, — будем исправлять.

И здесь на помощь приходит отладчик. Для начала поставим точки останова сразу в трёх местах:

    Чтобы поставить или снять точку останова, достаточно кликнуть левой кнопкой мыши справа от номера строки или поставить курсор на нужную строку, а затем нажать CTRL+F8. Почему мы хотим остановить программу именно там? Чтобы посмотреть, правильные ли числа сравниваются, а затем определить, в какую ветку в нашем ветвлении заходит программа дальше. Запускаем программу с помощью сочетания клавиш SHIFT+F9 или нажимаем на кнопку с жучком:

  

    Появится дополнительное окно, в котором нужно выбрать ваш девайс и приложение:

Вы в режиме дебага. Обратите внимание на две вещи:

  1. Точки останова теперь помечены галочками. Это значит, что вы находитесь на экране, где стоят эти точки, и что дебаггер готов к работе.
  2. Открылось окно дебага внизу: вкладка «5: Debug». В нём будет отображаться необходимая вам информация.

    Введём неравные числа и нажмём кнопку «РАВНО?». Программа остановилась на первой точке:

Давайте разбираться:

  1. Сразу подсвечивается синим строка, где программа остановлена: в окне кода на 28-й строке и в левом окне отладчика (там даже можно увидеть, какой метод вызван, — onClick).
  2. В правом, основном окне отладчика, всё гораздо интереснее. Здесь можно увидеть инстансы наших вью (answer, first, second), в конце которых серым текстом даже отображаются их id. Но интереснее всего посмотреть на firstInt и secondInt. Там записаны значения, которые мы сейчас будем сравнивать.

Как видим, значения именно такие, какие мы и ввели. Значит, проблема не в получении чисел из полей. Давайте двигаться дальше — нам нужно посмотреть, в правильную ли ветку мы заходим. Для этого можно нажать F8 (перейти на следующую строку выполнения кода). А если следующая точка останова далеко или в другом классе, можно нажать F9 — программа просто возобновит работу и остановится на следующей точке. В интерфейсе эти кнопки находятся здесь:

Остановить дебаггер, если он больше не нужен, можно через CTRL+F2 или кнопку «Стоп»:

    В нашем случае неважно, какую кнопку нажимать (F9 или F8). Мы сразу переходим к следующей точке останова программы:

Ветка правильная, то есть логика программы верна, числа firstInt и secondInt не изменились. Зато мы сразу видим, что подпись некорректная! Вот в чём была ошибка. Исправим подпись и проверим программу ещё раз.

    Мы уже починили два бага: падение приложения с помощью логов и некорректную логику (с помощью отладчика). Хеппи пас (happy path) пройден. То есть основная функциональность при корректных данных работает. Но нам надо проверить не только хеппи пас — пользователь может ввести что угодно. И программа может нормально работать в большинстве случаев, но вести себя странно в специфических состояниях. Давайте введём числа побольше и посмотрим, что будет:

Не сработало — программа хочет сказать, что 1000 не равна 1000, но это абсурд. Запускаем приложение в режиме отладки. Точка останова уже есть. Смотрим в отладчик:

Числа одинаковые, что могло пойти не так? Обращаем внимание на тип переменной — Integer. Так вот в чём проблема! Это не примитивный тип данных, а ссылочный. Ссылочные типы нельзя сравнивать через ==, потому что будут сравниваться ссылки объектов, а не они сами. Но для Integer в Java есть нюанс: Integer может кешироваться до 127, и если мы вводим по единице в оба поля числа до 127, то фактически сравниваем просто int. А если вводим больше, то получаем два разных объекта. Адреса у объектов не совпадают, а именно так Java сравнивает их.

Есть два решения проблемы:

  1. Изменить тип Integer на примитив int.
  2. Сравнивать как объекты.

    Не рекомендуется менять тип этих полей в реальном приложении: числа могут приходить извне, и тип лучше оставлять прежним. Изменим то, как мы сравниваем числа:

if (firstInt.equals(secondInt)) {
  answer.setText("Равно");
} else {
  answer.setText("Не равно");
}

Проверяем:

Всё работает. Наконец-то! Хотя… Давайте посмотрим, что будет, если пользователь ничего не введёт, но нажмёт на кнопку? Приложение опять упало… Смотрим в логи:

Опять NumberFormatException, при этом строка пустая. Давайте поставим точку останова на 26-й строке и заглянем с помощью отладчика глубже.

Нажмём F8 — и перейдём в глубины операционной системы:

    Интересно! Давайте обернём код в try/catch и посмотрим ошибке в лицо. Если что, поправим приложение. Выделяем код внутри метода onClick() и нажимаем Ctrl+Alt+T:

Выбираем try / catch, среда разработки сама допишет код. Поставим точку останова. Получим:

Запускаем приложение и ловим ошибку:

Действительно, как и в логах, — NumberFormatException. Метод parseInt выбрасывает исключение, если в него передать пустую строку. Как обрабатывать такую проблему — решать исключительно вам. Два самых простых способа:

  1. Проверять получаемые строки first.getText().toString() и second.getText().toString() на пустые значения. И если хоть одно значение пустое — говорить об этом пользователю и не вызывать метод parseInt.
  2. Или использовать уже готовую конструкцию try / catch:

Теперь-то точно всё в порядке! Хотя профессиональным тестировщикам это приложение никто не отдавал: поищете ещё ошибки? :)

Понравилась статья? Поделить с друзьями:
  • Toolbox ps3 hen ошибка 404
  • Too many processes on zabbix server как исправить
  • Too many heap sections как исправить
  • Tool 1cd ошибка формата потока
  • Too many es are not es как исправить