2015-11-10 15 views
11

私はViewPagerを持っており、そこにボタンを使用する必要があります。ボタンは音声を認識してTextViewに表示する必要があります。私はVoiceRecognitionとViewPagerのレイアウトを同じにしています。ViewPagerでボタンを実装する方法は?

質問:クリック後にVoiceRecognitionを実行するボタンをアクティブにする方法。 Buttonと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" /> 

+0

音声認識は、ビューページなしで単独で動作しますか?あなたが認識した言葉を記録することはできますか? –

+0

フラグメントを使用するように切り替えることはできますか?次に、FragmentStatePagerAdapterから拡張し、正しいフラグメントを "getItem(int position)"に返します。そのフラグメントは、ボタンが押されたときに正しいアクティビティーを簡単に開始し、結果に応答することができます。 –

+0

このチュートリアルをご覧ください:https://developer.android.com/training/animation/screen-slide.html(Subclassing PagerAdapterはFragmentStatePagerAdapterまたはFragmentPagerAdapterを使用するよりもはるかに難しいので、推奨されていません) –

答えて

1

あなたは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); 
     .... 
} 

How to access views from view pager

+0

クリックするとボタンの上に何も起こらない( – Nikolai

+0

詳細を教えてもらえますか? – Nikolai

1

あなたはinstantiateItem方法のみの内側onClickListenerを持つことができます。

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

    } 
} 
+0

あなたの答えはありがとうございます:「//ここではonClickイベントのものを!!」と言ってどういう意味ですか?これは、 'VoiceRecognition'の' onClick'メソッドを実装するのに、 'startActivityForResult'を強調します。 – Nikolai

+0

実装しないで実行すると(クラウドのように)ログ:' java.lang.NullPointerException: void null android.widget.Button.setTag(java.lang.Object) 'ヌルオブジェクト参照で' – Nikolai

+0

ボタン名が無効です。ヌルオブジェクト参照の理由e。ボタン名を「carButton」から「carBut」に変更してください。carButton.setTag("car");

関連する問題