尝试在片段中的Recycler视图上创建弹出菜单时出现InflateException

时间:2018-03-28 01:37:13

标签: android android-recyclerview kotlin popupmenu inflate-exception

我正在尝试在我的回收站视图项目中创建一个弹出菜单,该菜单位于片段中。一旦用户点击我的Recycler视图项目上的3个点,就应该创建菜单这里是我的适配器类代码:

class ExampleAdapter(context: Context, exampleList : ArrayList<Stream>) : RecyclerView.Adapter<ExampleAdapter.ViewHolder>() {

var mContext: Context = context
var favorites = exampleList

private var inflator: LayoutInflater? = LayoutInflater.from(context)

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
    val view = inflator?.inflate(R.layout.favorites_list_item_layout, parent, false)
    return ViewHolder(view)
}

override fun getItemCount(): Int {
    return favorites.size
}

override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
    val st = favorites.get(position)
    Picasso.with(mContext).load(favorites.get(position).image).into(holder?.stImage)
    holder?.sName?.text = st.name
    holder?.bind(st)
    holder?.deleteOption?.setOnClickListener(View.OnClickListener {

        var popup  = PopupMenu(mContext, holder.deleteOption!!)

        popup.setOnMenuItemClickListener { item: MenuItem? ->

            when (item!!.itemId) {
                R.id.delete -> {
                    Toast.makeText(mContext, "Showing Toast!", Toast.LENGTH_LONG).show()
                     true
                }
                else ->false
            }

        }
        popup.menuInflater.inflate(R.menu.favorite_menu,popup.menu)
        try {
            val fieldMPopup = PopupMenu::class.java.getDeclaredField("mPopup")
            fieldMPopup.isAccessible = true
            val mPopup = fieldMPopup.get(popup)
            mPopup.javaClass
                    .getDeclaredMethod("setForceShowIcon", Boolean::class.java)
                    .invoke(mPopup, true)
        } catch (e: Exception){
            Log.e("Main", "Error showing menu icons.", e)
        } finally {
            popup.show()
        }
    })

}

我传递的上下文来自片段,我以这种方式创建了上下文context = activity.applicationContext,我的错误/异常如下所示:

  

E / AndroidRuntime:致命异常:主要                     处理:com.example.app,PID:9724                     android.view.InflateException:二进制XML文件行#17:无法解析索引6处的属性:TypedValue {t = 0x1d / d = 0xffff4081 a = 3 r = 0x7f060035}

popup.show()抛出异常。

这是我最喜欢的菜单代码

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

<item
    android:id="@+id/delete"
    android:title="@string/delete" />
</menu>

这是我的favorites_list_item_layout

的代码
    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">


        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/five">

            <de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto"
                android:id="@+id/station_image"
                android:layout_width="70dp"
                android:layout_height="70dp"
                app:civ_border_width="@dimen/zero" />

            <TextView
                android:id="@+id/stations_stream_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_centerVertical="true"
                android:layout_marginStart="@dimen/hundred_three"
                android:text="Station Name"
                android:textColor="@color/white_color"
                android:textSize="@dimen/twenty"
                android:textStyle="bold"
                android:layout_alignParentLeft="true"
                android:layout_marginLeft="103dp" />


            <TextView
                android:id="@+id/delete_options"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:layout_marginEnd="@dimen/thirteen"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:text="&#8942;"
                android:textColor="@color/white_color"
                android:textAppearance="?android:textAppearanceLarge"
                android:layout_alignParentRight="true"
                android:layout_marginRight="@dimen/thirteen" />

        </RelativeLayout>


</LinearLayout>

这是我的ViewHolder类代码

 inner class ViewHolder(favoriteView: View?) : RecyclerView.ViewHolder(favoriteView) {

    val view = favoriteView
    var stationImage: CircleImageView? = null
    var stationName: TextView? = null
    var deleteOption : TextView? = null

    init {
        stationImage = view?.findViewById<CircleImageView>(R.id.station_image)
        stationName = view?.findViewById<TextView>(R.id.stations_stream_name)
        deleteOption = view?.findViewById(R.id.delete_options)

    }

1 个答案:

答案 0 :(得分:0)

您最好先创建一个界面。在您的活动/片段中初始化它并将其注入适配器。然后将其传递给视图持有者和视图持有者的View.OnclickListener块。你打电话给你的界面的点击方法。之后,您可以轻松地对您的片段/活动采取措施。

//1. Create Interface

            public interface RVListener {

            void onClick(View view, int position);}

//2. initialise your listener inside your fragment/activity

     private RVListener listener = (view, position) -> {
        // open your popup menu or ...
     };

//3.pass "listener" to the adapter

   MyAdapter adapter = new MyAdapter(data,listener);

//4. inside your adapter assign the variable and pass it to view holder

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

        private RVListener listener;
        private List<Data> data = new ArrayList<>();

        MyAdapter(List<Data> data, RVListener listener) {
            this.listener = listener;
            this.data = data;
        }

         @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            Context context = parent.getContext();
            View v = LayoutInflater.from(context).inflate(R.layout.my_layout, parent, false);
            return new RowViewHolder(v, listener);
        }
}

//5. handle Click inside your viewHolder
public class RowViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private RVListener listener;

    RowViewHolder(View v, RecyclerViewClickListener listener) {
        super(v);
        this.listener = listener;
        v.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        listener.onClick(view, getAdapterPosition());
    }
}

这样做之后。你肯定有Context来做你的弹出窗口。 希望它有所帮助。