如何从Android上的另一个类调用方法?

问题描述 投票:-3回答:4

我是编程的初学者。我在活动之外有一个函数,当用户在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);

        }

}

form control.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) {
            }
        });

    }


}
java android class
4个回答
2
投票

你的FormControl类扩展了Activity,这似乎是问题所在。

1 - 删除班上的extend关系。

public  class FormControl 

2 - 通过Activity的当前FormControl的上下文

 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);

1
投票

这是不允许的。

    FormControl formcontrol = new FormControl();

    formcontrol.ajustaEditText(edtName);

您具有intent的启动活动,将数据作为intent bundle对象传递。检查下面的例子。

How do I pass data between Activities in Android application?


0
投票

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;
}
}

0
投票

您将不得不将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) {
        }
    });
}}
© www.soinside.com 2019 - 2024. All rights reserved.