【问题标题】:How to call a method from another class on Android?如何在 Android 上调用另一个类的方法?
【发布时间】:2018-03-01 06:08:18
【问题描述】:

我是编程初学者。我在活动之外有一个函数,当用户在 EditText 中键入时,应用程序会显示一个 x 以清除表单。当我调用此函数时,会发生错误: android.content.res.Resources android.content.Context.getResources ()android.content.ContextWrapper.getResources 的空对象引用上 如果我离开同一个班级,它可以工作,但是我会在其他活动中大量使用这个功能

我研究了很多,但找不到解决方案

Activity.java

public class Activity extends AppCompatActivity{

    EditText edtName;

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

        edtName = (EditText)findViewById(R.id.edt1);

        FormControl formcontrol = new FormControl();

        formcontrol.ajustaEditText(edtName);

        }

}

FormControl.java

public  class FormControl extends AppCompatActivity {



    public void ajustaEditText(final EditText et){

        String value = "";

        final Drawable x =  getResources().getDrawable( R.drawable.ic_action_navigation_close);

        x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());

        et.setCompoundDrawables(null, null, value.equals("") ? null : x, null);

        et.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (et.getCompoundDrawables()[2] == null) {
                    return false;
                }
                if (event.getAction() != MotionEvent.ACTION_UP) {
                    return false;
                }
                if (event.getX() > et.getWidth() - et.getPaddingRight() - x.getIntrinsicWidth()) {
                    et.setText("");
                    et.setCompoundDrawables(null, null, null, null);
                }
                return false;
            }
        });
        et.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                et.setCompoundDrawables(null, null, et.getText().toString().equals("") ? null : x, null);
            }

            @Override
            public void afterTextChanged(Editable arg0) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
        });

    }


}

【问题讨论】:

  • 为什么FormControl 扩展AppCompatActivity?这不是一项活动。

标签: java android class


【解决方案1】:

您的FormControl 类扩展了Activity,这似乎是这里的问题。

1 - 删除您班级中的 extend 关系。

public  class FormControl 

2 - 传递FormControl 的当前Activity 的上下文

 private Context context;

 public FormControl(Context context){
 this.context = context 
}

3 - 从当前上下文中获取资源。

 final Drawable x =  context.getResources().getDrawable( R.drawable.ic_action_navigation_close);

4 - 获取 FormClass 的对象

FormControl formcontrol = new FormControl(this);

【讨论】:

  • 工作就像一个魅力,兄弟!谢谢!
【解决方案2】:

这是不允许的。

    FormControl formcontrol = new FormControl();

    formcontrol.ajustaEditText(edtName);

你有一个意图启动活动,将数据作为意图包对象传递。检查下面的示例。

How do I pass data between Activities in Android application?

【讨论】:

    【解决方案3】:

    FormControl 是活动,你不能创建活动实例,也可以获取活动实例。

    public static FormControl instance;
    
    public  class FormControl extends AppCompatActivity {
    
    public static FormControl getInstance() {
            return instance;
        }
    
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            instance = this;
    }
    }
    

    【讨论】:

      【解决方案4】:

      您必须将活动的Context 传递到要访问getResources() 的任何位置。

      就这样吧……

      活动类

      public class Activity extends AppCompatActivity{
      
      EditText edtName;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.acitivty);
      
          edtName = (EditText)findViewById(R.id.edt1);
      
          FormControl formcontrol = new FormControl();
      
          formcontrol.ajustaEditText(this, edtName);
      
          }
      }
      

      FormControl 类

      public  class FormControl {
      
      
      
      public void ajustaEditText(Context context,final EditText et){
      
          String value = "";
      
          final Drawable x =  context.getResources().getDrawable( R.drawable.ic_action_navigation_close);
      
          x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
      
          et.setCompoundDrawables(null, null, value.equals("") ? null : x, null);
      
          et.setOnTouchListener(new View.OnTouchListener() {
              @Override
              public boolean onTouch(View v, MotionEvent event) {
                  if (et.getCompoundDrawables()[2] == null) {
                      return false;
                  }
                  if (event.getAction() != MotionEvent.ACTION_UP) {
                      return false;
                  }
                  if (event.getX() > et.getWidth() - et.getPaddingRight() - x.getIntrinsicWidth()) {
                      et.setText("");
                      et.setCompoundDrawables(null, null, null, null);
                  }
                  return false;
              }
          });
          et.addTextChangedListener(new TextWatcher() {
              @Override
              public void onTextChanged(CharSequence s, int start, int before, int count) {
                  et.setCompoundDrawables(null, null, et.getText().toString().equals("") ? null : x, null);
              }
      
              @Override
              public void afterTextChanged(Editable arg0) {
              }
      
              @Override
              public void beforeTextChanged(CharSequence s, int start, int count, int after) {
              }
          });
      }}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-02
        • 2011-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-15
        • 1970-01-01
        相关资源
        最近更新 更多