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
7,9688 gold badges34 silver badges61 bronze badges
asked Apr 20, 2019 at 22:14
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
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
CommonsWareCommonsWare
975k189 gold badges2361 silver badges2437 bronze badges
you should find which folder save your MainActivity
.
For Example:
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
LongaleiLongalei
4233 silver badges8 bronze badges
Я столкнулся с проблемой при использовании Android Studio. Когда я пытаюсь запустить какое-либо приложение, я получаю ту же ошибку » tools:context=".MainActivity"
умолчанию не найдено», и в моем коде в строке tools:context=".MainActivity"
, MainActivity выделяется красным цветом и говорит «Unresolved class MainActivity». Это происходит, даже если я создаю совершенно новую «пустую активность».
Пока что я пробовал:
- обновление кеша IDE
- проверенные имена пакетов в манифесте Android и MainActivity
- выбор активности по умолчанию в конфигурации приложения
- убедился, что src является исходным каталогом
Я также заметил, что в моем «самом продвинутом» приложении build.gradle
выглядит так:
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>
Каталог проекта + код:
основной вид деятельности 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 с модулем имеется.
Сам класс ToggleButtonDemoActivity.java
Только учусь, поэтому буду рад всем замечаниям
__________________
0 |
Заблокирован |
|
09.01.2014, 22:56 |
2 |
недоглядел, ответ стер Добавлено через 10 минут
0 |
1 / 1 / 1 Регистрация: 06.08.2013 Сообщений: 16 |
|
09.01.2014, 23:01 [ТС] |
3 |
Добавлено через 10 минут Хм, странно. Может у меня эмулятор бунтует. Сейчас проверю на смартфоне Добавлено через 52 секунды
Добавлено через 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 |
не ломайте голову. попробуйте сначала фон закрасить у активити или у вьюхи и все получится. Сам спотыкался на этом моменте. Спасибо за совет, но я не до конца его понял. Закрасить фон? Как? Зачем?
0 |
2 / 2 / 0 Регистрация: 26.09.2013 Сообщений: 13 |
|
10.01.2014, 01:32 |
6 |
Перед первым листингом название файла у Вас active_main.xml, а в коде класса вы вызываете activity_main. Вот готовый проект из Эклипса. 100% работает на реальных устройствах на андройд 2.2, 2.3.4 и 4.03. Как закрасить фон — увидите в разметке строку android:background= «@color/white» Эта строка подразумевает, что в папке res/values имеется файл colors.xml а в нем описан цвет с названием white.
0 |
Заблокирован |
|
10.01.2014, 11:40 |
7 |
код рабочий на 100% все там меняется и нажимается и выводится
0 |
1 / 1 / 1 Регистрация: 06.08.2013 Сообщений: 16 |
|
10.01.2014, 13:28 [ТС] |
8 |
код рабочий на 100% все там меняется и нажимается и выводится Вот скрины эмулятор: и
0 |
Заблокирован |
|
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 |
файл с разметкой так и называется — activity_main.xml или все таки active_main.xml ? activity_main.xml Добавлено через 4 минуты
0 |
2 / 2 / 0 Регистрация: 26.09.2013 Сообщений: 13 |
|
11.01.2014, 01:01 |
11 |
Значит так! Как исправить: Если и теперь непонятно, то просто в файле манифеста замените MainActivity на ToggleButtonDemoActivity и сразу все заработает! Тему можно закрывать.
0 |
Приготовьте отладчик! Пишем приложение с ошибками, затем учимся их находить и дебажить
https://gbcdn.mrgcdn.ru/uploads/post/2735/og_image/ce05da5c8c8f97a3bf7713b7cbaf3802.png
Иногда в приложении встречаются ошибки, которые нельзя увидеть даже после запуска. Например, код компилируется, проект запускается, но результат далёк от желаемого: приложение падает или вдруг появляется какая-то ошибка (баг). В таких случаях приходится «запасаться логами», «брать в руки отладчик» и искать ошибки.
Часто процесс поиска и исправления бага состоит из трёх шагов:
- Воспроизведение ошибки — вы понимаете, какие действия нужно сделать в приложении, чтобы повторить ошибку.
- Поиск места ошибки — определяете класс и метод, в котором ошибка происходит.
- Исправление ошибки.
Если приложение не падает и чтение логов ничего не даёт, то найти точное место ошибки в коде помогает дебаггер (отладчик) — инструмент среды разработки.
Чтобы посмотреть на логи и воспользоваться дебаггером, давайте напишем простое тестовое (и заведомо неправильное) приложение, которое даст нам все возможности для поиска ошибок.
Это будет приложение, которое сравнивает два числа. Если числа равны, то будет выводиться результат «Равно», и наоборот. Начнём с простых шагов:
- Открываем Android Studio.
- Создаём проект с шаблоном Empty Activity.
- Выбираем язык 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("Равно"); } } }); } }
В этом коде всё просто:
- Находим поля ввода, поле с текстом и кнопку.
- Вешаем на кнопку слушатель нажатий.
- По нажатию на кнопку получаем числа из полей ввода и сравниваем их.
- В зависимости от результата выводим «Равно» или «Не равно».
Запустим приложение и введём буквы вместо чисел:
Нажмём на кнопку, и приложение упадёт! Время читать логи. Открываем внизу слева вкладку «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" /> ...
Теперь можем вводить только числа. Проверим, как работает равенство: введём одинаковые числа в оба поля. Всё в порядке:
На равенство проверили. Введём разные числа:
Тоже равно. То есть приложение работает, ничего не падает, но результат не совсем тот, который требуется. Наверняка вы и без дебаггинга догадались, в чём ошибка, потому что приложение очень простое, всего несколько строк кода. Но такие же проблемы возникают в приложениях и на миллион строк. Поэтому пройдём по уже известным нам этапам дебаггинга:
- Воспроизведём ошибку: да, ошибка воспроизводится стабильно с любыми двумя разными числами.
- Подумаем, где может быть ошибка: наверняка там, где сравниваются числа. Туда и будем смотреть.
- Исправим ошибку: сначала найдём её с помощью дебаггера, а когда поймём, в чём проблема, — будем исправлять.
И здесь на помощь приходит отладчик. Для начала поставим точки останова сразу в трёх местах:
Чтобы поставить или снять точку останова, достаточно кликнуть левой кнопкой мыши справа от номера строки или поставить курсор на нужную строку, а затем нажать CTRL+F8. Почему мы хотим остановить программу именно там? Чтобы посмотреть, правильные ли числа сравниваются, а затем определить, в какую ветку в нашем ветвлении заходит программа дальше. Запускаем программу с помощью сочетания клавиш SHIFT+F9 или нажимаем на кнопку с жучком:
Появится дополнительное окно, в котором нужно выбрать ваш девайс и приложение:
Вы в режиме дебага. Обратите внимание на две вещи:
- Точки останова теперь помечены галочками. Это значит, что вы находитесь на экране, где стоят эти точки, и что дебаггер готов к работе.
- Открылось окно дебага внизу: вкладка «5: Debug». В нём будет отображаться необходимая вам информация.
Введём неравные числа и нажмём кнопку «РАВНО?». Программа остановилась на первой точке:
Давайте разбираться:
- Сразу подсвечивается синим строка, где программа остановлена: в окне кода на 28-й строке и в левом окне отладчика (там даже можно увидеть, какой метод вызван, — onClick).
- В правом, основном окне отладчика, всё гораздо интереснее. Здесь можно увидеть инстансы наших вью (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 сравнивает их.
Есть два решения проблемы:
- Изменить тип Integer на примитив int.
- Сравнивать как объекты.
Не рекомендуется менять тип этих полей в реальном приложении: числа могут приходить извне, и тип лучше оставлять прежним. Изменим то, как мы сравниваем числа:
if (firstInt.equals(secondInt)) { answer.setText("Равно"); } else { answer.setText("Не равно"); }
Проверяем:
Всё работает. Наконец-то! Хотя… Давайте посмотрим, что будет, если пользователь ничего не введёт, но нажмёт на кнопку? Приложение опять упало… Смотрим в логи:
Опять NumberFormatException, при этом строка пустая. Давайте поставим точку останова на 26-й строке и заглянем с помощью отладчика глубже.
Нажмём F8 — и перейдём в глубины операционной системы:
Интересно! Давайте обернём код в try/catch и посмотрим ошибке в лицо. Если что, поправим приложение. Выделяем код внутри метода onClick() и нажимаем Ctrl+Alt+T:
Выбираем try / catch, среда разработки сама допишет код. Поставим точку останова. Получим:
Запускаем приложение и ловим ошибку:
Действительно, как и в логах, — NumberFormatException. Метод parseInt выбрасывает исключение, если в него передать пустую строку. Как обрабатывать такую проблему — решать исключительно вам. Два самых простых способа:
- Проверять получаемые строки first.getText().toString() и second.getText().toString() на пустые значения. И если хоть одно значение пустое — говорить об этом пользователю и не вызывать метод parseInt.
- Или использовать уже готовую конструкцию try / catch:
Теперь-то точно всё в порядке! Хотя профессиональным тестировщикам это приложение никто не отдавал: поищете ещё ошибки?