【问题标题】:getSystemService() not working on Adapter ClassgetSystemService() 不适用于适配器类
【发布时间】:2017-04-06 13:11:14
【问题描述】:

我试图将 onClickListener 添加到 RecyclerView 内的按钮,该按钮将复制一个字符串,但它说 getSystemService(CLIPBOARD_SERVICE) 不可用。

public void onBindViewHolder(ViewHolder holder, int position) {
        holder.title.setText(cardItems.get(position).title);
        holder.content.setText(cardItems.get(position).content);
        holder.copyButton.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){

                myClipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
                String text;
                text = EditText.getText().toString();
                myClip = ClipData.newPlainText("text", text);
                myClipboard.setPrimaryClip(myClip);

                Toast.makeText(getApplicationContext(), "Text Copied", Toast.LENGTH_SHORT).show();
            }
        });
    }

【问题讨论】:

  • 使用 context.getSystemService()

标签: java android android-adapter android-context clipboardmanager


【解决方案1】:

您需要Context 才能做到这一点。执行:

...
public void onClick(View v) {
    myClipboard = (ClipboardManager) v.getContext().getSystemService(CLIPBOARD_SERVICE);
    ...
}

【讨论】:

    【解决方案2】:

    适配器没有自己的存在。它为活动工作。因此,如果您想调用该类型的服务或其他活动事物,则必须传递使用此适配器的该活动的上下文。所以打电话给context

    喜欢

     myClipboard = (ClipboardManager)context.getSystemService(CLIPBOARD_SERVICE);
    

    【讨论】:

      【解决方案3】:

      您必须使用上下文来获取System Service,将其添加到您的构造函数中,并在创建适配器时将其作为参数传递:

      private Context context;
      
      //Constructor 
      public YourAdapter(Context context){
      this.context = context;
      }
      
      public void onBindViewHolder(ViewHolder holder, int position) {
              holder.title.setText(cardItems.get(position).title);
              holder.content.setText(cardItems.get(position).content);
              holder.copyButton.setOnClickListener(new View.OnClickListener(){
                  public void onClick(View v){
      
                      myClipboard = (ClipboardManager)context.getSystemService(CLIPBOARD_SERVICE);
                      String text;
                      text = EditText.getText().toString();
                      myClip = ClipData.newPlainText("text", text);
                      myClipboard.setPrimaryClip(myClip);
      
                      Toast.makeText(getApplicationContext(), "Text Copied", Toast.LENGTH_SHORT).show();
                  }
              });
          }
      

      【讨论】:

      • 无需将Context 传递给构造函数。 View 具有上下文感知能力。
      • 我不能使用 context.getSystemService(Context.CLIPBOARD_SERVICE); ??
      【解决方案4】:

      试试这个

      在适配器类中:添加这个构造函数

      private Activity mActivity;
      
          public adapter(Activity activity){
               mActivity = activity;
      }
      

      然后通过这个mActivity变量调用getSystemService()

      myClipboard =(ClipboardManager)mActivity.getSystemService(CLIPBOARD_SERVICE);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多