【问题标题】:It crashes my app when I put onClickListener on a ImageView当我将 onClickListener 放在 ImageView 上时,它会使我的应用程序崩溃
【发布时间】:2021-11-03 01:16:36
【问题描述】:

总结问题
各位开发者, 所以.. 我正在寻找一个 PopupMenù,它出现在单击以下图标时,该图标停留在 ListView 中的项目上。我想在点击时出现一个带有一些选项的弹出栏

描述您的尝试
我尝试按照有关创建弹出菜单的教程进行操作,但方法始终相同,对此我没有任何问题。但它在 Logcat 上向我显示了这个 Null Pointer 错误,我尝试通过初始化 ImageView 来修复,但目前没有任何正确的方法.. 例如,我尝试执行“image = (Imageview)findviewbyId(R.id.imagesrc)”之类的操作,但它总是出现以下错误:

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.isilente/com.example.isilente.HomePage}:java.lang.NullPointerException:尝试调用虚拟方法 'void android.widget.ImageView.setOnClickListener (android.view.View$OnClickListener)' 在空对象引用上

适当时,显示一些代码
我在编码时遇到这种情况: 类 -> Homepage.java

public class HomePage extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

DrawerLayout drawerLayout;
NavigationView navigationView;
Toolbar toolbar;
private AppCompatButton getstart, augurio;


//new stuff
private ArrayList<Music> my_mainarraylist;
private MusicAdapter my_musicadapter;
private ListView listView_songs;
ImageView imageView_puntini;
//end new stuff



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_page);
    getstart=findViewById(R.id.GetStart);
    imageView_puntini=findViewById(R.id.imageview_puntini);
    listView_songs=findViewById(R.id.listview_buongiorno);


    //START NEW STUFF
    my_mainarraylist=new ArrayList<>();
    my_mainarraylist.add(new Music("Buongiorno#1", "Pozione Polisucchio", R.raw.silente, R.id.imageview_play, R.id.imageview_stop, R.id.imageview_puntini));
    my_mainarraylist.add(new Music("Augurio", "Hai dato il massimo", R.raw.massimo, R.id.imageview_play, R.id.imageview_stop, R.id.imageview_puntini));

    MusicAdapter adapter = new MusicAdapter(this, R.layout.songs_item_listview,my_mainarraylist);
    listView_songs.setAdapter(adapter);



    listView_songs.setVisibility(View.GONE);
    //FINE NEW STUFF

    /*----Hooks----*/
    drawerLayout = findViewById(R.id.drawerLayout);
    navigationView = findViewById(R.id.nav_view);
    toolbar = findViewById(R.id.toolbar);
    /*----Toolbar----*/
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);
    /*----NavigationDrawerMenu----*/

    //Menu menu = navigationView.getMenu();

    navigationView.bringToFront();
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar,R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawerLayout.addDrawerListener(toggle);
    toggle.syncState();
    //navigationView.setCheckedItem(R.id.nav_home);

    navigationView.setNavigationItemSelectedListener(this);

    getstart.setOnClickListener(v -> listView_songs.setVisibility(View.VISIBLE));

    //popup
    imageView_puntini.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            PopupMenu popupMenu = new PopupMenu(HomePage.this, v);
            MenuInflater menuInflater = popupMenu.getMenuInflater();
            menuInflater.inflate(R.menu.menuset, popupMenu.getMenu());
            popupMenu.show();
        }
    });
    //popup end
}

在资源/菜单中:

   <menu><item
    android:id="@+id/item_settings"
    android:title="Settings"
    android:showAsAction="ifRoom|withText"
    />
<item
    android:id="@+id/item_about"
    android:title="About"
    android:showAsAction="ifRoom|withText"
    /></menu>

然后我得到了这个,它是 ListView 上的 Item..songs-item-listview.xml:

 <?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:background="#152238"
    android:paddingLeft="5dp"
    android:paddingRight="16dp">

    <ImageView
        android:id="@+id/audio_microfono"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic__431742_audio_communication_instrument_media_microphone_icon"
        />

    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textview_songs"
        android:text="Current song"
        android:textStyle="bold"
        android:textColor="#eee86b"
        android:textSize="16sp"
        android:layout_toEndOf="@+id/audio_microfono"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textview_artist"
        android:text="Current artist"
        android:textStyle="italic"
        android:textColor="#eee86b"
        android:layout_toEndOf="@+id/audio_microfono"
        android:layout_below="@+id/textview_songs"
        android:textSize="16sp"
        />
    </androidx.appcompat.widget.LinearLayoutCompat>

    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:orientation="horizontal">

    <ImageView
        android:id="@+id/imageview_play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingRight="10dp"
        android:src="@drawable/ic_play"/>

    <ImageView
        android:id="@+id/imageview_stop"
        android:layout_width="wrap_content"
        android:layout_alignParentEnd="true"
        android:paddingRight="5dp"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_stop"
        />

        <ImageView
            android:id="@+id/imageview_puntini"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_trepuntini"
            />
    </androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>

有人说按钮不在主要活动中但在另一个活动中可能发生错误,但无论如何,您建议我怎么做?

Ps:这是 LogCat :

2021-09-05 20:20:19.629 9883-9883/com.example.isilente E/AndroidRuntime: 致命异常: main 进程:com.example.isilente,PID:9883 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.isilente/com.example.isilente.HomePage}: java.lang.NullPointerException:尝试调用虚拟方法'void android.widget.ImageView.setOnClickListener(android.view.View$OnClickListener)' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 引起:java.lang.NullPointerException:尝试调用虚拟方法'void android.widget.ImageView.setOnClickListener(android.view.View$OnClickListener)' 在空对象引用上 在 com.example.isilente.HomePage.onCreate(HomePage.java:94) 在 android.app.Activity.performCreate(Activity.java:8000) 在 android.app.Activity.performCreate(Activity.java:7984) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:223) 在 android.app.ActivityThread.main(ActivityThread.java:7656) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

块引用 块引用 块引用

【问题讨论】:

  • 嗨,这看起来不像一个完整的例子(GetStart 定义在哪里?)。如果您将其缩减为一个完整的工作示例(创建一个新的干净项目并在那里尝试),您会发现您会得到更好的答案,该示例只有您正在尝试做的一件事(例如,使用单个 ImageView 和添加一个 onClickListener 到它)。

标签: java android xml android-studio android-listview


【解决方案1】:

请添加这个

<ImageView
            android:id="@+id/imageview_puntini"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_trepuntini"
            />

到您定义列表视图的activity_home_page.xml,而不是列表视图项songs-item-listview.xml,因为您正试图从活动中访问它。

【讨论】:

  • 如果我这样做,它可以工作,但不像我想要的那样......因为我希望这个 ImageView 成为 listView 的一部分......对于 listView 上的每个项目,我都有这个图标。 ..不知道我解释清楚了没有..
  • 那就看this
  • 谢谢瓦尔沙!有用!非常感谢!
【解决方案2】:

尝试像这样初始化你的 PopupMenu

popup.getMenu().add(groupId, itemId, order, title);

对于您要添加的每个MenuItem。 您也可以查看此link 以查看其他解决方案
(我的解决方案取自this man

【讨论】:

  • 我应该添加我已有的关于弹出菜单的代码吗?
猜你喜欢
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多