используя onClickView для вызова другого класса - PullRequest
0 голосов
/ 04 февраля 2011

Я хочу использовать нажатие кнопки, чтобы передать параметры выбора другому классу, который будет строить экран карты, используя переданные параметры.Я сосредоточен на том, чтобы заставить мое действие кнопки работать.Я использую onCLickListener и onCLickView следующим образом:

Class1:

public class Class1  extends Activity implements OnClickListener {

    Class2 class2;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

..........

       Button button = (Button)findViewById(R.id.btn_configup1);
        button.setOnClickListener(this);        
   }

    public void onClick(View v) {
        Class2 class2 = new Class2();
        //Save state.. selections and params and use bundle
        //to pass into class2
        class2.execMapBuild();

    }    


}


Class2:

открытый класс Class2 расширяет MapActivity {

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.drawable.navup);
}


public void execMapBuild() {    
        finish(); //just in case we return.
        Intent intent = new Intent(CLass2.this, Class2.class);
        startActivity(intent);

    }

У меня все работает, кроме нужного действия кнопки.Я хочу, чтобы нажатие кнопки в Class1.onVlickView вызывало Class2.execMapBuild с использованием действия нажатия кнопки.У меня есть кнопка, фиксирующая действие и вызывающая метод execMapBuild в Class2.Но я получаю исключение NullPointerException при его переходе от startActivity (намерение) к onCreate.

Я пробовал несколько других способов закрепить это, но это кажется лучшим, и я, кажется, близок к тому, чтобы выяснить это.Я был бы очень признателен за объяснение того, что я могу упустить.Добавлен код, который изначально не был скопирован.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2011

Чтобы расширить ответ @Heiko Rupp, если вы хотите, чтобы Class2 отображал карту, необходимо расширить что-то вроде Activity. Таким образом, вы не можете просто вызвать его с помощью обычного метода. Вам необходимо зарегистрировать Activity в своем манифесте, а затем вызвать его, используя Intent. Вот пример того, что вы должны делать:

public class Class1 extends Activity implements OnClickListener {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        Button button = (Button)findViewById(R.id.btn_configup1);
        button.setOnClickListener(this);        
   }

    public void onClick(View v) {
        Intent intent = new Intent(Class1.this,Class2.class);
        intent.putExtra("key","data");
        ...
        startActivity(intent);
    }
}

public class Class2  extends MapActivity {

    String mData;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            mData = extras.getString("key");
            ...
        }
        ...
    }
}

Могу ли я также предложить вам использовать более описательные имена классов, чем Class1 и Class2.

2 голосов
/ 04 февраля 2011

Class2 не является действием, поэтому система не будет вызывать обратные вызовы действия.

И если бы это было Activity, вы не могли бы просто вызвать его через new Class2(), поскольку все еще обратные вызовы не выполняются.

Попытайтесь очистить это, а затем запустите деятельность Class2 из Class1 с Intent, как вы делаете в execMapBuild().

...