2017-01-19 102 views
-1

我實際上無法定義問題,這就是爲什麼問題是這樣的。Android - 關於TTS和其他東西

作爲一個團隊,我們正在製作一個使用網站RSS的新聞應用程序,並且我的工作是爲項目添加文本到語音選項以便只讀取新聞標題。代碼如下。我們正在使用TabActivity。

問題是我不能採取精確的數據。例如,當你在「日報」選項卡,它開始閱讀「運動」標籤這是一個後,它開始閱讀之前等標籤的一些其他選項卡

MainActivity

public class MainActivity extends AppCompatActivity implements NewsResultListener { 

private SectionsPagerAdapter mSectionsPagerAdapter; 
private ViewPager mViewPager; 
private Speaker speakerManager; 
private ArrayList<News> titleListStable = new ArrayList<>(); 
private static ArrayList<News> titleList = new ArrayList<>(); 
private static ArrayList<ArrayList<News>> newsList = new ArrayList<>(); 
private int selectedPage; 

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

    speakerManager = new Speaker(this); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 
    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      titleListStable = titleList; 
      Toast.makeText(getApplicationContext(), "" + position , Toast.LENGTH_LONG).show(); 
      selectedPage = position; 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    if(speakerManager != null) 
    { 
     speakerManager.shutdown(); 
    } 
} 

@Override 
public void onSuccess(ArrayList<News> news) { 

} 

@Override 
public void onFail() { 

} 

/** 
* A placeholder fragment containing a simple view. 
*/ 
public static class PlaceholderFragment extends Fragment implements NewsResultListener { 
    /** 
    * The fragment argument representing the section number for this 
    * fragment. 
    */ 
    private static final String ARG_SECTION_NUMBER = "section_number"; 

    private RecyclerView rvNews; 
    private RecyclerView.Adapter adapter; 
    private RecyclerView.LayoutManager mLayoutManager; 
    private ArrayList<News> dataset; 

    public PlaceholderFragment() { 
    } 

    /** 
    * Returns a new instance of this fragment for the given section 
    * number. 
    */ 
    public static PlaceholderFragment newInstance(int sectionNumber) { 
     PlaceholderFragment fragment = new PlaceholderFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_main, container, false); 
     rvNews = (RecyclerView) rootView.findViewById(R.id.rvNews); 
     mLayoutManager = new LinearLayoutManager(getContext()); 
     rvNews.setLayoutManager(mLayoutManager); 
     dataset = new ArrayList<>(); 
     adapter = new NewsAdapter(dataset, getActivity()); 
     rvNews.setAdapter(adapter); 

     switch (getArguments().getInt(ARG_SECTION_NUMBER)) { 
      case 0: 
       new RssFeedParser(this).execute("guncel"); 
       break; 
      case 1: 
       new RssFeedParser(this).execute("spor"); 
       break; 
      case 2: 
       new RssFeedParser(this).execute("ekonomi"); 
       break; 
      case 3: 
       new RssFeedParser(this).execute("turkiye"); 
       break; 
      case 4: 
       new RssFeedParser(this).execute("dunya"); 
       break; 
      case 5: 
       new RssFeedParser(this).execute("kultur-sanat"); 
       break; 
      case 6: 
       new RssFeedParser(this).execute("politika"); 
       break; 
      case 7: 
       new RssFeedParser(this).execute("bilim-teknoloji"); 
       break; 
      case 8: 
       new RssFeedParser(this).execute("yasam"); 
       break; 
      case 9: 
       new RssFeedParser(this).execute("saglik"); 
       break; 
      case 10: 
       new RssFeedParser(this).execute("analiz-haber"); 
       break; 
      case 11: 
       new RssFeedParser(this).execute("gunun-basliklari"); 
       break; 
     } 

     //TextView textView = (TextView) rootView.findViewById(R.id.section_label); 
     //textView.setText(getString(R.string.section_format,)); 

     return rootView; 
    } 


    @Override 
    public void onSuccess(ArrayList<News> news) { 


     for(News item : news) 
     { 
      dataset.add(item); 

     } 
     titleList=dataset; 
     newsList.add(dataset); 

     adapter.notifyDataSetChanged(); 
    } 

    @Override 
    public void onFail() { 

    } 
} 

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return PlaceholderFragment.newInstance(position); 
    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 12; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 

     switch (position) { 
      case 0: 
       return "GÜNCEL"; 
      case 1: 
       return "SPOR"; 
      case 2: 
       return "EKONOMİ"; 
      case 3: 
       return "TÜRKİYE"; 
      case 4: 
       return "DÜNYA"; 
      case 5: 
       return "KÜLTÜR SANAT"; 
      case 6: 
       return "POLİTİKA"; 
      case 7: 
       return "BİLİM TEKNOLOJİ"; 
      case 8: 
       return "YAŞAM"; 
      case 9: 
       return "SAĞLIK"; 
      case 10: 
       return "ANALİZ HABER"; 
      case 11: 
       return "GÜNÜN BAŞLIKLARI"; 
     } 
     return null; 
    } 
} 

public void imageButton(View v){ 


    for(News i: titleListStable){ 
     String title = i.getTitle(); 

     speakerManager.speak(title); 
    } 
} 
    } 

音箱類

public class Speaker { 

private TextToSpeech mTextToSpeech; 
private boolean mIsTTSEnabled = true; 

public Speaker(final MainActivity act){ 

    mTextToSpeech = new TextToSpeech(act, new TextToSpeech.OnInitListener() { 
     @Override 
     public void onInit(int i) { 
      if(i == TextToSpeech.SUCCESS){ 
       mTextToSpeech.setLanguage(new Locale("TR-tr")); 


       switch (mTextToSpeech.isLanguageAvailable(new Locale("TR-tr"))) 
       { 
        case TextToSpeech.LANG_MISSING_DATA: 
        case TextToSpeech.LANG_NOT_SUPPORTED: 
         Toast.makeText(act, "Cihazda Türkçe konuşma sentezi desteklenmemektedir.", Toast.LENGTH_SHORT).show(); 
        default: 
         break; 
       } 

      }else{ 
       mIsTTSEnabled = false; 
      } 
     } 
    }); 
} 

public void speak(final String announce){ 
    if(mIsTTSEnabled){ 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      mTextToSpeech.speak(announce, TextToSpeech.QUEUE_ADD, null, ""); 
     } 
     else 
     { 
      mTextToSpeech.speak(announce, TextToSpeech.QUEUE_FLUSH, null); 
     } 
    } 
} 

public void shutdown(){ 
    if(mTextToSpeech != null) 
    { 
     mTextToSpeech.stop(); 
    } 
} 
    } 

注:如果你想達到整個代碼,點擊; https://github.com/dnkilic/AnadoluAjansi

回答

0

這是ViewPager默認行爲,我們可以自定義使用setOffscreenPageLimit這種行爲,但我們又不能設置限制小於1

設置應該保留,兩側的頁數處於空閒狀態的視圖層次結構中的當前頁面爲 。超出此限制的頁面將在需要時從適配器重新創建。

這是作爲優化提供的。如果您事先知道您需要支持的頁面的數量爲 ,或者在您的頁面上有 位置的延遲加載機制,那麼調整此設置可以帶來 感知的分頁動畫和交互的平滑性。如果您有 少量的頁面(3-4),您可以一次保持活動狀態, 用戶頁面來回更少的時間將花費在新創建的視圖子樹的佈局上 。

您應該保留此限制低,特別是如果你的網頁有複雜的 佈局。此設置默認爲1

如果試圖設置限制小於1(例如mViewPager.setOffscreenPageLimit(0);),你應該在logcat中獲取有關此警告,類似:

Requested offscreen page limit 0 too small; defaulting to 1 

檢查thisthis SO回答更多信息。

希望這對你有所幫助。

+0

也許我無法表達自己,但我的問題不在於記憶。無論如何,謝謝你。解決方案的不同方法。 –

+0

我向你解釋爲什麼當你在**每日**選項卡中時,爲什麼你的下一個選項** ** sports **加載。這是因爲ViewPager的默認行爲。檢查我的答案。 –

+0

SO答案鏈接只是爲了深入解釋爲什麼少於1頁的限制是不允許的。 –