2017-08-11 51 views
0

我在列表视图中的每个项目中都有一个弹出式菜单。当您点击左边的图像视图(设置3点的图像)时,会出现一个弹出菜单。然而,我得到错误showPopupMenu方法在ImageView上点击时不起作用

Could not find a method showPopupMenu(View) in the activity class android.app.Application for onClick handler on view class android.widget.ImageView with id 'settings_img' 

没有人知道这个错误是什么。很明显,找不到方法,但它是因为找不到类/视图?如果是的话,我该如何解决它?感谢 main_activity

package com.example.george.hostscanmenus; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.PopupMenu; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 

    List hostList; 
    ArrayAdapter<String> hostAdapter; 
    PopupMenu popup; 
    String subnet = "192.168.10."; 
    ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     hostList = new ArrayList<String>(); 

     //populating host addresses 
     for(int i = 0; i < 255; i++) { 
      hostList.add(subnet+i +"-aa:bb:00:cc:33:ee"); 
     } 

     //inflating adapter 
     listView = (ListView) findViewById(R.id.scan_list); 
     hostAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.host_item, R.id.ip_address, hostList); 
     listView.setAdapter(hostAdapter); 


    } 

    /* code for popup menu in listview */ 
    public void showPopupMenu(View v) { 
     popup = new PopupMenu(this, v); 
     popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
      @Override 
      public boolean onMenuItemClick(MenuItem menuItem) { 
       switch (menuItem.getItemId()) { 
        case R.id.change_icon: 
         Toast.makeText(getApplicationContext(), menuItem.getTitle(), Toast.LENGTH_SHORT).show(); 
         return true; 
        case R.id.notifications: 
         Toast.makeText(getApplicationContext(), menuItem.getTitle(), Toast.LENGTH_SHORT).show(); 
         return true; 
        default: 
         return MainActivity.super.onContextItemSelected(menuItem); 
       } 
      } 
     }); 
     MenuInflater inflater = popup.getMenuInflater(); 
     inflater.inflate(R.menu.host_menu, popup.getMenu()); 
     popup.show(); 
    } 
} 

阵列适配器

package com.example.george.hostscanmenus; 

import android.content.Context; 
import android.support.annotation.NonNull; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.ArrayList; 

/** 
* Created by george on 8/11/17. 
*/ 

public class HostAdapter extends ArrayAdapter<String> { 

    public HostAdapter(Context context, int num, ArrayList<String> allHost) { 
     super(context, 0, allHost); 
    } 

    @NonNull 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Get the data item for this position 
     String host = getItem(position); 
     // Check if an existing view is being reused, otherwise inflate the view 
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.activity_main, parent, false); 
     } 
     // Lookup view for data population 
     ImageView nodeHostImgView = (ImageView) convertView.findViewById(R.id.host_icon); 
     TextView nodeIpTxtView = (TextView) convertView.findViewById(R.id.ip_address); 
     TextView nodeMacTxtView = (TextView) convertView.findViewById(R.id.mac_address); 
     ImageView nodeArrowImgView = (ImageView) convertView.findViewById(R.id.port_scan_arrow); 
     // Populate the data into the template view using the data object 
     nodeHostImgView.setImageResource(R.drawable.ic_computer_white_24dp); 
     nodeIpTxtView.setText(host.substring(0,host.indexOf("-"))); 
     nodeMacTxtView.setText(host.substring(host.indexOf("-"))); 
     nodeArrowImgView.setImageResource(R.drawable.ic_keyboard_arrow_right_white_24dp); 
     // Return the completed view to render on screen 
     return convertView; 
    } 


} 

主要XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:ads="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:id="@+id/scan_list_linear" 
    tools:context=".MainActivity"> 

    <!-- labels for ip/mac addres list --> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/list_label"> 

     <TextView 
      android:id="@+id/host_port_label" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.20" 
      android:text="Host" 
      android:textSize="20dp" 
      android:textAlignment="center" 
      android:textColor="@color/colorAccent"/> 

     <TextView 
      android:id="@+id/ip_open_label" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.80" 
      android:textSize="20dp" 
      tools:text="IP/MAC" 
      android:paddingLeft="10dp" 
      android:textColor="@color/colorAccent"/> 

     <TextView 
      android:id="@+id/scan_label" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.20" 
      android:text="Scan" 
      android:textSize="20dp" 
      android:textAlignment="center" 
      android:textColor="@color/colorAccent"/> 


    </LinearLayout> 

    <!--Listview to display scan output--> 
    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/scan_list"/> 

</LinearLayout> 

列表项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" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 

    <LinearLayout 
     android:id="@+id/text_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <ImageView 
      android:id="@+id/settings_img" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="0.10" 
      android:padding="3dp" 
      android:src="@drawable/ic_action_more_vert" 
      android:onClick="showPopupMenu"/> 

     <ImageView 
      android:id="@+id/host_icon" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="0.20" 
      android:padding="5dp" 
      android:src="@drawable/ic_computer_white_24dp"/> 

     <LinearLayout 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.50" 
      android:orientation="vertical" 
      android:paddingLeft="0dp" 
      > 

      <TextView 
       android:id="@+id/ip_address" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textSize="18dp" 
       tools:text="192.168.10.100" 
       /> 

      <TextView 
       android:id="@+id/mac_address" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textSize="16dp" 
       tools:text="aa:bb:cc:00:11:22" 
       /> 
     </LinearLayout> 

     <ImageView 
      android:id="@+id/port_scan_arrow" 
      android:layout_width="0dp" 
      android:layout_height="match_parent" 
      android:layout_weight="0.20" 
      android:padding="5dp" 
      android:src="@drawable/ic_keyboard_arrow_right_white_24dp"/> 

    </LinearLayout> 
</RelativeLayout> 

菜单XML

<!-- listview menu for host scan options eg: 
    change hostname, icon, notification etc --> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <!-- Settings, should always be in the overflow --> 
    <item android:id="@+id/change_icon" 
     android:title="change icon" 
     /> 


    <item android:id="@+id/notifications" 
     android:title="set notification" 
     /> 

</menu> 
+0

您应该在适配器类中使用'showPopupMenu()'逻辑,不要忘记将上下文传递给适配器。 –

+0

如何从适配器上的mainActivity访问上下文。我虽然上下文被传递到适配器类中的适配器构造函数 – miatech

回答

0

您应该在适配器getView上定义您的settings_img,并为每个元素添加一个点击侦听器。

例如:

ImageView settingsImgView = (ImageView) convertView.findViewById(R.id.settings_img); 

settingsImgView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      context.showPopupMenu() //or popupmenu logic in here if you want 
     } 
    }); 
+0

? – miatech

+0

我在2天前使用mainActivity中的菜单代码做了这个.. – miatech

+0

是settingsImage.setOnClickListener()进入适配器上的getView()方法吗? – miatech

0

通常情况下,当涉及到适配器,我通过活动本身而不是背景。然后,我将活动的上下文传递给super(),并将活动保留在字段变量中。这样我就可以使用父级活动的所有公共方法。