Я занимался разработкой и подумал о небольшой проблеме, с которой я сталкиваюсь при разработке под Android с помощью Java. У меня есть этот класс MainActivity. Представление - это всего лишь несколько кнопок, и каждая кнопка вызывает разные действия. Прямо сейчас у меня есть этот код

public class MainActivity extends AppCompatActivity {
    private Button button;

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

    button = findViewById(R.id.pedidos);

    button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(), PedidosActivity.class);
            startActivity(intent);
        }
    });
}

Итак, учитывая, что мне нужно добавить еще две кнопки, чтобы я мог запустить еще два разных действия в зависимости от того, какую кнопку я нажимаю, мне нужно будет два раза повторить этот код n раз для каждого нового действия, которое я добавлю в проект. Я считаю, что должен быть лучший способ сделать это. Я уже думал, что смогу сделать фабричный шаблон, используя класс в качестве интерфейса с методом, который будет callActivity (). Вот так:

public interface ActivityFactory(){
public OnClickListener setOnClickListener();
}

Этот метод получит через параметры контекст действия, которое создает новое представление, тип Enum с различными представлениями в качестве параметров, и он вернет новый eventListener для кнопки, которая приведет вас к новому представлению, например так:

@Override
button.setOnClickListener(getContextActivity(), EnumClass.NewActivity);

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

РЕДАКТИРОВАТЬ: Я думаю, что я оставил часть объяснения, поэтому я добавлю его здесь. Я хотел пропустить создание новых двух кнопок, поэтому я хотел знать, как создать только одну кнопку и дать ей значение вида в зависимости от того, какую кнопку вы нажимаете.

1
Victor Garcia 22 Фев 2018 в 16:06

5 ответов

Лучший ответ

Вы можете сделать это как - допустим, у вас есть действия A, B и C. Вы хотите позвонить в A, B и C из HomeActivity.

Сначала поместите LinearLayout в макет HomeActivity как -

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_add_event"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    <!--Your container will hold your buttons-->
    <LinearLayout 
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        />
    </RelativeLayout>

Теперь в вашем HomeActivity создайте массив класса как -

public class HomeActivity extends AppCompatActivity implements View.OnClickListener{
    private Class[] arrayClass= {A.class, B.class,C.class}; // classes you want to open
      private String[] buttonNames= {"A", "B", "C"};  // button texts

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        LinearLayout container = (LinearLayout)findViewId(R.id.container);
        // adding buttons in container
        for(int index=0;index<arrayClass.length && arrayClass.lenght == buttonNames.length; index++){
            Button button = new Button(this);
            button.setText(buttonNames[index]);
            button.setOnClickListener(this)
            button.setTag(arrayClass[index]);
            container.addView(button);
        }
    }

   @Override
    public void onClick(View v) {

    if(v.getTag() instanceOf Class ){
      // will open your particular activity
      startActivity(new Intent(this,(Class)v.getTag()));
    }

   }

}

Теперь просто добавьте новый тип класса и имя в вашем массиве. Ваш код работает сам

1
Sanjay Kumar 22 Фев 2018 в 14:51

Посмотри это,

Class<?> c = Class.forName("SecondPage");
Intent newActivity = new Intent(this, c);
0
MSD 22 Фев 2018 в 13:14

implements View.OnClickListener после этого вы можете добавить findViewByid кнопки, затем взять button имя и setOnClickListener(this); LIKE {{X5} }

Смотрите мой код ниже:

public class EventsListActivity extends AppCompatActivity implements View.OnClickListener{

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_events_list);

        init();
    }
    private void init() {
        txtClose = (TextView) findViewById(R.id.txtClose);
        txtClose.setOnClickListener(this);

        txtAdd = (TextView) findViewById(R.id.txtAdd);
        txtAdd.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {

        case R.id.txtAdd:
            Intent intent = new Intent(this, AddEventActivity.class);
            startActivity(intent);
        break;

        case R.id.txtClose:
            finish();
        break;      
    }
}
0
Banana 22 Фев 2018 в 15:05

Используйте ButterKnife ,

Это свяжет все ваши взгляды, простота кодирования

Например:

class ExampleActivity extends Activity {
    @BindView(R.id.title) TextView title;
    @BindView(R.id.subtitle) TextView subtitle;
    @BindView(R.id.footer) TextView footer;

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simple_activity);
        ButterKnife.bind(this);
        // TODO Use fields...
    }
}

И для обработки клика,

Использовать это,

@OnClick({ R.id.door1, R.id.door2, R.id.door3 })
public void pickDoor(View view) {
    switch (view.getId()) {
    case R.id.door1:

        break;
    case R.id.door2:

        break;
    case R.id.door3:

        break;
    default:

        break;
    }
}

И добавьте плагин Android ButterKnife Zelezny в андроид студию.

Для получения дополнительной информации посмотрите http://jakewharton.github.io/butterknife/

Надеюсь, это поможет вам

1
Banana 22 Фев 2018 в 14:42

Вы можете создать один View.OnClickListener и использовать его в нескольких кнопках:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    findViewById(R.id.button_1).setOnClickListener(mButtonsClickListener);
    findViewById(R.id.button_2).setOnClickListener(mButtonsClickListener);
    ....
}


private View.OnClickListener mButtonsClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button_1:
                // Actions for button 1
                break;
            case R.id.button_2:
                // Actions for button 2
                break;

        }
    }
};
2
W0rmH0le 22 Фев 2018 в 13:10