performClick () і callOnClick () нічого не роблять

Я додаю голосові команди до вже існуючих і повністю функціонуючих програм. Голосова взаємодія, здається, працює нормально. Я можу сказати команду, я отримую правильний результат, і я навіть отримую правильну кнопку, яку клік взаємодія хочу імітувати, використовуючи голос.

Моя проблема полягає в тому, що performClick() і callOnClick() навіть не викликаються. Кожна кнопка має свій слухач (робота вручну).

Як сторона примітки: Я закликаю click-методи за межами моєї діяльності. Це проблема?

Як я можу отримати ці методи, щоб дійсно викликати на мої кнопки?

PS: Можливо, деякі пропозиції будуть використовувати функції direclty замість використання click-event. Перше, чому я не хочу цього робити, це те, що я хочу уникнути дублювання коду або реструктуризації коду, і по-друге, я хотів би, щоб моє розпізнавання голосу не було занадто глибоким в коді, поводячи себе як простий користувач (звідси програмний клік).

EDIT:

В основному я не роблю нічого, окрім:

З моєї основної діяльності я закликаю свій помічник:

util = new MainVoiceUtil(this, getLayoutInflater(), viewgroup);

viewgrouphere is unrelated to this topic. In MainVoiceUtil it goes:

public MainVoiceUtil(Context context, LayoutInflater inflater, Viewgroup viewgroup)
{
   super(context);
   ...
}

MainVoiceUtil extends VoiceUtil, which contains a method onResult, which contains the performClick. context is set in the constructor of VoiceUtil. See:

@Override
public void onResult(AIResponse result)
{
   View button = ((Activity) context).findViewById(buttonId);
   button.performClick();
}

Завдяки виходу журналу, я знаю, що у мене є права кнопка. Це означає, що я знаю, що вводжу метод onResult . Відображаються всі виходи журналу, але цей клік не виконується.

0
ви можете зробити кнопку static також public , використовуйте button.performClick (); безпосередньо або callOnClick (). А також перевірте, чи зареєстрований слухач onclick перед викликом.
додано Автор Jyoti JK, джерело
де ви дзвоните на виконанняclick ()? в тій же діяльності?
додано Автор Jyoti JK, джерело
Налаштування кнопки static або public не є рішенням для мене, тому що кожна кнопка потребує цього. Як я вже писав, я не дзвоню з моєї діяльності, я перейшов через контекст, отримав кнопку і назвав performClick() на кнопці (див. Код).
додано Автор KJaeg, джерело
@ TuấnKiệt Я передав контекст, отримав кнопку за його ідентифікатором і назвав його performClick() (див. Фрагмент коду).
додано Автор KJaeg, джерело
@ TuấnKiệt Я додав більш детальний код, щоб краще пояснити ситуацію.
додано Автор KJaeg, джерело
як ви можете посилатися на вашу кнопку (через findViewById (buttonId)), коли ця кнопка знаходиться поза межами вашої діяльності, чи можете ви описати більш конкретні?
додано Автор Tuấn Kiệt, джерело
@KJaeg Як ви можете передати контекст через намір? Ви можете показати нам свій код PLS?
додано Автор Tuấn Kiệt, джерело
@KJaeg Я знайшов рішення, перевірте свою відповідь нижче:
додано Автор Tuấn Kiệt, джерело

5 Відповіді

Для цього ви повинні встановити clickListener

View button = ((Activity) context).findViewById(buttonId);

    button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
           //implement your logic
        }
    });

button.performClick();
1
додано
Потім введіть цю кнопку.
додано Автор Bhavya Gandhi, джерело
Як я вже сказав, кожна кнопка вже має свій clickListener. Це повністю функціональна програма, яку споживачі продуктивно використовують. Тому я хочу назвати тих існуючих слухачів, а не реалізувати нові.
додано Автор KJaeg, джерело
@BhavyaGandhi і це те, що нічого не робить.
додано Автор KJaeg, джерело

view.performClick() worked fine.
Make sure that you find view and add clicklisterner before call this function.

1
додано

Замість того, щоб використовувати Діяльність, намагайтеся передати свою діяльність. Не контекст.

Button button =(Button) (youractivity).findViewById(buttonId);//YourActivity.this
button.performClick();

Це може допомогти.

0
додано
На жаль, це нічого не змінює. Єдина різниця тепер полягає в тому, що у мене є небезпека зіткнутися з помилками, пов'язаними з відтвореннями, які можна натиснути, якщо я не працюю з ними.
додано Автор KJaeg, джерело

Виявилося, що я називаю неправильний метод. Основною діяльністю було перевизначення методу, який називається onButtonClick . Цей вирішувався за допомогою ідентифікатора, на яку кнопку було натиснуто. Я подумав, що його викликають у будь-який час, як тільки було запущено onClick , що, здається, не було. Здається, що йде іншим шляхом. Натиснувши вручну, обидва працюють разом. Але в моєму випадку мені довелося перейти з button.performClick() , щоб замість цього викликати onButtonClick (buttonId) .

З цим я не був знайомий, а значить, і моя плутанина. Таким чином, це було скоріше непорозуміння, що стосується конкретного проекту.

0
додано

Перш за все, я не рекомендую називати кнопку на клацанні іншою Дією , оскільки це дуже погана практика.

Хоча моє рішення нижче працює добре, але я не можу гарантувати, що він буде працювати у випадку, якщо ваша перша діяльність буде зруйнована і знову Це все ще погана практика

My solution:

MainActivity

public class MainActivity extends AppCompatActivity {

TextView mTextView;
Button mButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Bridge.setContext(this);
    mTextView = findViewById(R.id.test_text_view);
    mTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("MainActivity", "test_text_view onClick() called!");
        }
    });
    mButton = findViewById(R.id.button2);
    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(i);
        }
    });
}
}

SecondActivity

public class SecondActivity extends AppCompatActivity {

    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        button = findViewById(R.id.second_activity_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i("SecondActivity", "second_activity_button onClick() called!");
                MainActivity activity = (MainActivity) Bridge.getContext();
                TextView textView = activity.findViewById(R.id.test_text_view);
                textView.performClick();
            }
        });
    }
}

Bridge

public class Bridge {

    public static Context sContext;

    public static Context getContext() {
        return sContext;
    }

    public static void setContext(Context context) {
        sContext = context;

    }
}


enter image description here
-> Click Hello World!
Logcat:
enter image description here
Start the second Activity by click BUTTON and then click BUTTON in SecondActivity:
enter image description here
enter image description here

My sample project can be found here: https://github.com/raiytu4/stackcase005

Удачі

0
додано
Дякуємо за вашу докладну відповідь, але ваше рішення kinda пропускає тему. Я не намагаюся "копіювати" onClick -функціональність до інших віджетів. Я не залишаю моєї діяльності. Я все ще в своїй діяльності. Моя активність просто викликає звичайний клас, який знову намагається performClick() . Я додав більше коду, щоб зробити ситуацію яснішою. Але в цілому я роблю саме те, що ви описали: я передаю контекст, отримую кнопку і викликаю performClick .
додано Автор KJaeg, джерело
Так. Це нічого не змінило. Він просто створив додаткові зусилля, оскільки у мене є декілька "кліків" віджетів, які не просто кнопки. Але в моєму тесті це дійсно було дитиною класу ImageButton.
додано Автор KJaeg, джерело
Чи спробуєте ви набрати максимально конкретний тип, наприклад: Кнопка кнопка = (( YourActivity ) контекст). button.performClick (); Замість Переглянути кнопку = (( Діяльність ) контекст) .findViewById (buttonId); button.performClick ();
додано Автор Tuấn Kiệt, джерело
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.