LoginSignup
7
7

More than 1 year has passed since last update.

Android の PopupMenu がめんどくさすぎる

Last updated at Posted at 2016-04-21

ので簡単なラッパーを書いた

##これを

def item1 = PopupMenuItem("sample menu 1"){ _ =>
  Log info "item1"
}
def item2 = PopupMenuItem("sample menu 2"){ _ =>
  Log info "item2"
}

##こうして

def showMenu(context: Context, targetView: View): Unit = {
  PopupMenuBox(context, targetView).show(item1, item2)
}

##こうじゃ

Screen Shot 2016-04-21 at 12.11.54 PM.png

便利!

##コード

import android.content.Context
import android.support.v7.widget.PopupMenu
import android.support.v7.widget.PopupMenu.OnMenuItemClickListener
import android.view.{MenuItem, Menu, View}
import x7c1.wheat.macros.logger.Log

class PopupMenuBox private (
  context: Context,
  view: View,
  items: Seq[PopupMenuItem]){

  def show() = {
    val menu = new PopupMenu(context, view)
    val pairs = items.zipWithIndex
    pairs foreach {
      case (item, index) =>
        menu.getMenu.add(Menu.NONE, index, index, item.title)
    }
    menu setOnMenuItemClickListener toListener(pairs)
    menu.show()
  }
  private def toListener(pairs: Seq[(PopupMenuItem, Int)]) =
    new OnMenuItemClickListener {
      override def onMenuItemClick(menuItem: MenuItem): Boolean = {
        pairs collectFirst {
          case (item, index) if menuItem.getItemId == index => item
        } match {
          case Some(item) => item.onTapped onItemTapped MenuItemTappedEvent()
          case None => Log error s"unknown menu-id:${menuItem.getItemId}"
        }
        true
      }
    }
}
object PopupMenuBox {
  def apply(context: Context, view: View): MenuHolder = {
    new MenuHolder(context, view)
  }
  class MenuHolder (context: Context, view: View){
    def show(items: PopupMenuItem*): Unit = {
      new PopupMenuBox(context, view, items).show()
    }
  }
}
case class PopupMenuItem(
  title: String,
  onTapped: OnPopupMenuItemTapped
)
object PopupMenuItem {
  def apply(title: String)(f: MenuItemTappedEvent => Unit): PopupMenuItem = {
    val listener = new OnPopupMenuItemTapped {
      override def onItemTapped(event: MenuItemTappedEvent): Unit = f(event)
    }
    PopupMenuItem(title, listener)
  }
}

trait OnPopupMenuItemTapped {
  def onItemTapped(event: MenuItemTappedEvent): Unit
}

case class MenuItemTappedEvent()
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7