Как реализовать кнопку в ViewPager?

У меня есть ViewPager, и мне нужно использовать там кнопку. Кнопка должна распознавать голос и отображать его в TextView. Я реализую один и тот же макет для VoiceRecognition и для ViewPager.

Вопрос: как активировать кнопку для запуска VoiceRecognition после нажатия. Я пытаюсь установить тег на кнопку и TextView, но я делаю это неправильно, это не работает.

ViewPager:

public class SwipeAdapter extends PagerAdapter{

private int[] car = {R.string.car1, R.string.car2,
        R.string.car3, R.string.car4, R.string.car5};
private Context context;
private LayoutInflater layoutInflater;

public SwipeAdapter(Context context){
    this.context = context;
}

@Override
public int getCount() {
    return car.length;
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return (view==(RelativeLayout)object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = layoutInflater.inflate(R.layout.carSwipe, container, false);

    //Implement the Button

    Button carBut = (Button)itemView.findViewById(R.id.buttonCar);
    carButton.setTag("car");

     TextView textView = (TextView) itemView.findViewById(R.id.interTextView);
textView.setTag("text");
    textView.setText(car[position]);
    container.addView(itemView);
    return itemView;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((RelativeLayout)object);
}
}

Распознавание голоса

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.carSwipe);
    Button recognizeButton = (Button)findViewById(R.id.button1);
    recognizeButton.setOnClickListener(this);
}

@Override
public void setContentView(View context) {
    final DisplayMetrics dm = context.getResources().getDisplayMetrics();
    final Configuration conf = context.getResources().getConfiguration();
    conf.locale = new Locale("en");
    context.getResources().updateConfiguration(conf, dm);
}

@Override
public void onClick(View v) {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "You may speak!");
    intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en-US");
    startActivityForResult(intent, 1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1 && resultCode == RESULT_OK) {
        ArrayList<String> results;
        results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

        //Set a tag here
        TextView speechText = (TextView) mPager.findViewWithTag("text" + results);
        String str="";
        for(int i=0;i<results.size();i++){
            str+= results.get(i);
        }
        speechText.setText(str);
    }
}
}

XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:gravity="center|center_horizontal"
    android:id="@+id/linearLayout">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/interTextView" />
</LinearLayout>

<Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="recognition"
    android:id="@+id/buttonRec"
    android:layout_above="@+id/linearLayout"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true" />


person JohnPix    schedule 10.11.2015    source источник
comment
Распознавание речи работает само по себе без вьюпейджера? Например, вы можете регистрировать слова, которые он распознал?   -  person OneCricketeer    schedule 12.11.2015
comment
Есть ли возможность перейти на использование фрагментов? Затем вы можете расширить FragmentStatePagerAdapter и просто вернуть правильный фрагмент в getItem (int position). Затем этот фрагмент может легко начать правильное действие при нажатии кнопки и реагировать на результат.   -  person Jeroen Mols    schedule 18.11.2015
comment
Посмотрите это руководство: developer.android.com/training/animation/screen -slide.html (Подклассы PagerAdapter намного сложнее, чем просто использование FragmentStatePagerAdapter или FragmentPagerAdapter, и, следовательно, не рекомендуется)   -  person Jeroen Mols    schedule 18.11.2015


Ответы (2)


Вы можете найти представление с требуемым тегом внутри onActivityResult и изменить его по мере необходимости:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1 && resultCode == RESULT_OK) {
         .... Get required ID
         TextView linearLayout=(TextView) pager.findViewWithTag("page" + requiredId);
         ..... preform required chagnes
    }
}

Вам нужно установить теги при создании экземпляра:

public Object instantiateItem(ViewGroup container, int position) {
      ....
      textView.setTag("page" + position);
      ....
}

Как получить доступ к представлениям из пейджера просмотра

person Nikolay Shmyrev    schedule 10.11.2015
comment
При нажатии на кнопку ничего не происходит( - person JohnPix; 11.11.2015
comment
Можете ли вы дать мне более подробную информацию? - person JohnPix; 12.11.2015

Вы можете иметь onClickListener только внутри метода instanceItem.

import android.view.View.OnClickListener;

public class SwipeAdapter extends PagerAdapter{

private int[] car = {R.string.car1, R.string.car2,
    R.string.car3, R.string.car4, R.string.car5};
private Context context;
private LayoutInflater layoutInflater;
private final int REQ_CODE_SPEECH_INPUT = 100;
public SwipeAdapter(Context context){
    this.context = context;
}

@Override
public int getCount() {
   return car.length;
}

@Override
public boolean isViewFromObject(View view, Object object) {
   return (view==(RelativeLayout)object);
} 

@Override
public Object instantiateItem(ViewGroup container, int position) {
    layoutInflater =    (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = layoutInflater.inflate(R.layout.carSwipe, container, false);

//Implement the Button

    Button carBut = (Button)itemView.findViewById(R.id.buttonCar);
    carBut.setTag("car");

    TextView textView = (TextView) itemView.findViewById(R.id.interTextView);
    textView.setTag("text");
    textView.setText(car[position]);
    container.addView(itemView);

     carBut.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Log.d("pager position", ""+position);

                    //do onClick event stuff here!!
            Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
            intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"You may Speak!!");
            try {
            context.startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
             } catch (ActivityNotFoundException a) {
                Toast.makeText(context,"Speech not supported!!",
                Toast.LENGTH_SHORT).show();
                  }
                }
                });         

    return itemView;

}

Тогда onActivityResult может выглядеть так.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
    case REQ_CODE_SPEECH_INPUT: {
        if (resultCode == RESULT_OK && null != data) {

            ArrayList<String> result = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            Log.d("SPEECHINPUT",""+result.get(0));

        }
        break;
    }

    }
}
person Prasad Mhapankar    schedule 17.11.2015
comment
Спасибо за Ваш ответ! Но что вы имеете в виду, говоря: //do onClick event stuff here!!? Что мне туда поставить? Я пытаюсь реализовать здесь метод onClick из VoiceRecognition, но он подчеркивает startActivityForResult. - person JohnPix; 17.11.2015
comment
Когда я запускаю его без реализации (как в вашем примере), он падает. Журнал: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setTag(java.lang.Object)' on a null object reference - person JohnPix; 17.11.2015
comment
Недопустимое имя кнопки, причина ссылки на нулевой объект. Измените название кнопки с carButton на carBut в строке ‹code›carButton.setTag(car);‹/code› - person Devendra Vaja; 18.11.2015