Как вызвать пользовательскую активность внутри метода onCreate

#java #android #android-studio #dialog #custom-activity

#java #Android #android-studio #диалоговое окно #пользовательская активность

Вопрос:

Я разрабатываю простое приложение, в котором есть два действия: MainActivity и SecondActivity, а также прозрачная пользовательская активность, расширяющая диалоговое окно. У MainActivity есть две кнопки ( Yes_button и No_button ).

  • Когда пользователь нажимает Yes_button , SecondActivity вызывается через Intent, а CustomActivity будет перед ним.
  • Когда пользователь нажимает No_button , также вызывается SecondActivity, но CustomActivity не будет вызываться вместе с ним.

Вызов пользовательской активности основан на выражениях оператора if-else . Пользовательская активность имеет кнопку пропуска, при нажатии на которую пользовательская активность закрывается, только тогда вторая активность может быть доступна пользователю. SecondActivity имеет только одну кнопку, которая вызывает MainActivity, и цикл продолжается.

Проблема

Когда приложение запускается и пользователь нажимает на No_button , SecondActivity будет вызываться без CustomActivity (как и ожидалось!), Но КАК ТОЛЬКО пользователь нажимает на Yes_button , SecondActivity будет продолжать отображаться вместе с CustomActivity ДАЖЕ при No_button нажатии.

Ожидание

Я хочу, чтобы SecondActivity вызывался вместе с CustomActivity при каждом нажатии Yes_button , а также позволял вызывать только SecondActivity при каждом No_button нажатии.

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xml:toos="http://schemas.android.com/tools">

    <TextView
        android:id="@ id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@ id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@ id/text" />

    <Button
        android:id="@ id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@ id/button1" />

</RelativeLayout>
 

MainActivity.java

 public class MainActivity extends BaseActivity implements View.OnClickListener {

    private static int getNumber;
    Button Yes_button;
    Button No_button;

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

        Yes_button = findViewById(R.id.button1);
        No_button = findViewById(R.id.button2);
        Yes_button.setOnClickListener(this);
        No_button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                int get_input = 1;  // will be use in if else statement.
                getNumber = get_input;
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
                break;
            case R.id.button2:
                Intent intent2 = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent2);
                break;

        }
    }

    public static int get_Logic() {
        return getNumber;
    }
}
 

activity_second_activity.xml

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xml:toos="http://schemas.android.com/tools">

    <TextView
        android:id="@ id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@ id/text"
        android:onClick="Click"
        android:text="Click" />

</RelativeLayout>
 

SecondActivity.java

 public class SecondActivity extends AppCompatActivity {

    private static int output;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second_activity);
        int received = MainActivity.get_Logic();
        output = received;
        Display();
    }

    public final void Display() {
        if (output == 1) {
            CustomActivity custom = new CustomActivity(SecondActivity.this);
            custom.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            custom.show();
        } else {
            CustomActivity custom = new CustomActivity(SecondActivity.this);
            custom.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            custom.cancel();
        }

    }

    public void Click(View view) {
        Intent intent = new Intent(SecondActivity.this, MainActivity.class);
        startActivity(intent);
    }
}
 

activity_custom_activity.xml

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="180dp"
    android:layout_height="250dp"
    xml:toos="http://schemas.android.com/tools">

    <TextView
        android:id="@ id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@ id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@ id/text"
        android:text="Skip" />

</RelativeLayout>
 

CustomActivity.java

 class CustomActivity extends Dialog {

    Button SkipButton;
    private Activity main;

    public CustomActivity(Activity constr) {
        super(constr);
        this.main = constr;
    }

    @Override
    protected void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setCancelable(false);
        setContentView(R.layout.activity_custom_activity);
        SkipButton = findViewById(R.id.button);
        SkipButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
    }
}
 

checking.xml

 <?XML version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="#FFFF" />
            <corners android:radius="20dp" />
            <stroke android:width="4dp" android:color="@color/colorPrimary" />
            <gradient />
        </shape>
    </item>
</selector>
 

Комментарии:

1. пожалуйста, оберните свой код в два ««»s

Ответ №1:

В Android для передачи данных из действия в другое вам не нужно объявлять статическую переменную ( getNumber в MainActivity), вы должны использовать Intent и Bundle вместе. Смотрите решение ниже.

MainActivity.java

 public class MainActivity extends BaseActivity implements View.OnClickListener {

    Button Yes_button;
    Button No_button;

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

        Yes_button = findViewById(R.id.button1);
        No_button = findViewById(R.id.button2);
        Yes_button.setOnClickListener(this);
        No_button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int input = v.getId() == R.id.button1 ? 1 : 0;
        Intent intent = new Intent(MainActivity.this, SecondActivity.class);
        intent.putExtra("input", input);
        startActivity(intent);
    }
}
 

SecondActivity.java

 public class SecondActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second_activity);
        Display();
    }

    public final void Display() {
        int input = getIntent().getIntExtra("input", 0);
        CustomActivity custom = new CustomActivity(SecondActivity.this);
        custom.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        if (input == 1) {
            custom.show();
        } else {
            custom.cancel();
        }
    }

    public void Click(View view) {
        finish();
    }
}
 

Комментарии:

1. Потрясающе! это сработало для меня. Я пытался решить эту проблему уже несколько недель, но безрезультатно. Я действительно благодарен, что вы мне помогли. Не могли бы вы, пожалуйста, объяснить мне эту строку кодов? int input = v.getId() = = R.id.button1 ? 1: 0; Особенно это? 1:0

2. Это более короткая версия вашего кода. Если идентификатор нажатой кнопки равен R.id.button1, тогда верните 1, в противном случае (R.id.buttob2) верните 0. Наконец, присвоите значение входной переменной.

3. Как я могу добиться этого с помощью трех кнопок. Я пытался это сделать, но это не работает. в MainActivity button1, button2 и button3 int input2 = v.getId() == R.id.button1? 1:0; int input2 = v.getId() == R.id.button1? 2:0; Намерение ok = новое намерение (Main.this, Second.class ); ok.putExtra(«input1», input1); ok.putExtra(«input2», input2); startActivity(ok); Во втором действии int Input1= GetIntent().getIntExtra(«input1»,0); int Input2= GetIntent().getIntExtra(«input2»,0); if(input1==1){custom.show();} else if(input2==2){custom. Cancel();} else{Сделать некоторые другие вещи}

4. int input = 0; if (v.getId() == R.id.button1) {input = 1;} else if (v.getId() == R.id.button2) {input = 2;} else {input = 3;}

5. Во SecondActivity, если input = 1, нажимается button1 . если ввод = 2, нажата кнопка 2. если input = 3, нажата кнопка 3.