#java #android #android-studio
#java #Android #android-studio
Вопрос:
Я пытаюсь создать приложение, но когда я его тестирую, приложение вылетает до его открытия. Глядя на logcat, я получаю эти сообщения:
2020-09-19 12:51:13.619 5686-5686/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.josullivan.mytestapplication, PID: 5686
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.josullivan.mytestapplication/com.josullivan.mytestapplication.MainActivity}:
android.view.InflateException: Binary XML file line #34 in
com.josullivan.mytestapplication:layout/activity_main: Binary XML file line #34 in
com.josullivan.mytestapplication:layout/activity_main: Error inflating class
com.google.android.material.navigation.NavigationView
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at
android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: android.view.InflateException: Binary XML file line #34 in
com.josullivan.mytestapplication:layout/activity_main: Binary XML file line #34 in
com.josullivan.mytestapplication:layout/activity_main: Error inflating class
com.google.android.material.navigation.NavigationView
Caused by: android.view.InflateException: Binary XML file line #34 in
com.josullivan.mytestapplication:layout/activity_main: Error inflating class
com.google.android.material.navigation.NavigationView
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at android.view.LayoutInflater.createView(LayoutInflater.java:852)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1004)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:959)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:1121)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1082)
at android.view.LayoutInflater.inflate(LayoutInflater.java:680)
at android.view.LayoutInflater.inflate(LayoutInflater.java:532)
at android.view.LayoutInflater.inflate(LayoutInflater.java:479)
at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696)
at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170)
at com.josullivan.mytestapplication.MainActivity.onCreate(MainActivity.java:48)
at android.app.Activity.performCreate(Activity.java:8000)
at android.app.Activity.performCreate(Activity.java:7984)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at
android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
2020-09-19 12:51:13.620 5686-5686/? E/AndroidRuntime: Caused by: android.view.InflateException:
Couldn't resolve menu item onClick handler onClickHandler in class
com.josullivan.mytestapplication.MainActivity
at androidx.appcompat.view.SupportMenuInflater$InflatedOnMenuItemClickListener.<init>
(SupportMenuInflater.java:255)
at androidx.appcompat.view.SupportMenuInflater$MenuState.setItem(SupportMenuInflater.java:484)
at androidx.appcompat.view.SupportMenuInflater$MenuState.addItem(SupportMenuInflater.java:531)
at androidx.appcompat.view.SupportMenuInflater.parseMenu(SupportMenuInflater.java:207)
at androidx.appcompat.view.SupportMenuInflater.inflate(SupportMenuInflater.java:129)
at com.google.android.material.navigation.NavigationView.inflateMenu(NavigationView.java:366)
at com.google.android.material.navigation.NavigationView.<init>(NavigationView.java:234)
at com.google.android.material.navigation.NavigationView.<init>(NavigationView.java:121)
... 28 more
Caused by: java.lang.NoSuchMethodException:
com.josullivan.mytestapplication.MainActivity.onClickHandler [interface android.view.MenuItem]
at java.lang.Class.getMethod(Class.java:2072)
at java.lang.Class.getMethod(Class.java:1693)
at androidx.appcompat.view.SupportMenuInflater$InflatedOnMenuItemClickListener.<init>
(SupportMenuInflater.java:251)
... 35 more
В конце говорится, что он не может разрешить onClickHandler в пункте меню, который, я думаю, вызывает проблему, но я не знаю как. В моем приложении будет несколько фрагментов, каждый из которых (при условии, что я смогу заставить его работать) будет иметь несколько холстов для рисования фигур пальцем, поэтому я использовал onClickHandler для инициализации класса paintView в MainActivity.java с правильным пользовательским видом холста, чтобы рисовать пальцем на соответствующем виде.
Есть ли у вас какие-либо идеи, почему это вызывает эту проблему и как это исправить?
Я новичок в Java-кодировании, можете ли вы объяснить мне это, как будто мне 5 лет?
Большое спасибо
MainActivity.java
package com.josullivan.mytestapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
import android.view.Menu;
import android.view.MenuInflater;
import com.google.android.material.navigation.NavigationView;
public class MainActivity extends AppCompatActivity implements
NavigationView.OnNavigationItemSelectedListener {
private DrawerLayout drawer;
private PaintView paintView;
public void onClickHandler(View view) {
switch (view.getId()) {
case R.id.nav_chat:
paintView = (PaintView) findViewById(R.id.paintView1);
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
paintView.init(metrics);
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer,
toolbar, R.string.navigation_drawer_open,R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction().replace(
R.id.fragment_container,
new MessageFragment()).commit();
navigationView.setCheckedItem(R.id.nav_message);
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.nav_message:
getSupportFragmentManager().beginTransaction().replace(
R.id.fragment_container, new MessageFragment()).commit();
break;
case R.id.nav_chat:
getSupportFragmentManager().beginTransaction().replace(
R.id.fragment_container, new ChatFragment()).commit();
break;
case R.id.nav_profile:
getSupportFragmentManager().beginTransaction().replace(
R.id.fragment_container, new ProfileFragment()).commit();
break;
case R.id.nav_share:
Toast.makeText(this, "Share", Toast.LENGTH_SHORT).show();
break;
case R.id.nav_send:
Toast.makeText(this, "Send", Toast.LENGTH_SHORT).show();
break;
}
drawer.closeDrawer(GravityCompat.START);
return true;
}
@Override
public void onBackPressed() {
if (drawer.isDrawerOpen(GravityCompat.START)){
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
}
Ответ №1:
- Что-то не так в XML-файле, соответствующем строке 34 проверки MainActivity, поскольку вывод сообщения предполагает «Строку двоичного файла XML # 34»
- Можете ли вы предоставить дополнительную информацию? Опубликуйте код MainActivity, реализован ли у вас onClickHandler или он отсутствует?
Комментарии:
1. Добавлен код MainActivity.java Я думаю, что это уже реализовано. Это в коде, который я только что добавил
2. Вы должны переопределить общедоступный абстрактный метод void onClick (View v) .
3. вы имеете в виду метод OnClickHandler? однако это не абстрактно. Когда я попытался добавить @Override строку над методом OnClickHandler, появляется красная строка и сообщение (при наведении на него курсора мыши), в котором говорится: Метод не переопределяет метод из своего суперкласса
4. Да, я думаю, проблема в том, что вы используете метод с именем «onClickHandler ()», который я не нахожу ни в одной документации… Используйте метод instead для переопределения onClick() — см. Ссылку developer.android.com/reference/android/view /…
5. ккз, я попробую. Я вернусь позже сегодня или завтра спасибо за помощь