2015-11-10 19 views
11

Mam ViewPager i muszę użyć przycisku tam. Przycisk musi rozpoznać głos i pokazać go w TextView. Implementuję ten sam układ dla VoiceRecognition i ViewPager.Jak zaimplementować przycisk w ViewPager?

Pytanie brzmi: jak aktywować przycisk, aby uruchomić rozpoznawanie głosu po kliknięciu. Próbuję ustawić tag na przycisku i TextView, ale robię to źle, to nie działa.

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); 
} 
} 

rozpoznawania głosu

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" /> 

+0

Czy rozpoznawanie mowy działa samodzielnie bez podglądu? Jak możesz rejestrować słowa, które rozpoznał? –

+0

Czy można przełączyć na używanie fragmentów? Następnie można rozszerzyć z FragmentStatePagerAdapter i po prostu zwrócić poprawny fragment w "getItem (pozycja int)". Fragment ten może następnie łatwo rozpocząć prawidłowe działanie po naciśnięciu przycisku i zareagować na wynik. –

+0

Zapoznaj się z tym samouczkiem: https://developer.android.com/training/animation/screen-slide.html (Subclassing PagerAdapter jest znacznie trudniejsze niż po prostu użycie FragmentStatePagerAdapter lub FragmentPagerAdapter, a więc nie jest zalecanym podejściem) –

Odpowiedz

1

Można widoku z odpowiednim znacznikiem wewnątrz onActivityResult i modyfikować je zgodnie z wymaganiami:

@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 
    } 
} 

Musisz ustawić znaczniki podczas wystąpienia:

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

How to access views from view pager

+0

Po kliknięciu na przycisku nic się nie dzieje ( – Nikolai

+0

Czy możesz podać mi więcej szczegółów? – Nikolai

1

Można mieć onClickListener tylko wewnątrz metody instantiateItem.

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; 

} 

Wtedy onActivityResult może wyglądać tak.

@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; 
    } 

    } 
} 
+0

Dziękuję za odpowiedź! Ale co masz na myśli mówiąc: '// zrób tutajKlik wydarzenia wydarzenie tutaj!'? Co powinienem tam umieścić? implementować tutaj metodę 'onClick' z' VoiceRecognition', ale podkreśla 'startActivityForResult'. – Nikolai

+0

Po uruchomieniu go bez implementacji (jak w twoim przykładzie) ulega awarii. void android.widget.Button.setTag (java.lang.Object) "przy odwołaniu do obiektu zerowego" – Nikolai

+0

Nazwa przycisku jest nieprawidłowa, przyczyna odwołania do obiektu zerowego mi. Zmień nazwę przycisku z "carButton" na "" carBut "na linii carButton.setTag("car");