2017-01-19 64 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页的限制是不允许的。 –