如何使用视图寻呼机和操作栏控制片段?
How to control fragments using view pager and action bar?
我现在有一个 activity 包含片段
[1] , [2] , [3] , [4]
一次启动应用程序 [1] 和 [2] 运行。
当滑动到 [2] 运行 [3] 并滑动到 [3] 运行 [4] 时。
任何人都可以帮助解决这个问题。
我想要 [1] 中的功能 [1]、[2] 中的 [2] 以及 [3] 中的 [3]、[4] 中的 [4] 选项卡滑动。
下面是我的代码
片段[1]:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.meaningview, container, false);
word = (EditText) view.findViewById(R.id.word);
data = (WebView) view.findViewById(R.id.web);
if(first == 1)
{
try {
dbHelper = new SqlLiteDbHelper(getActivity());
dbHelper.CopyDataBaseFromAsset();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
first++;
}
find.setOnClickListener(new OnClickListener() {
@SuppressWarnings("static-access")
@SuppressLint({ "NewApi", "DefaultLocale" })
@Override
public void onClick(View v) {
url2 = word.getText().toString().toLowerCase();
urlword = url2;
InputMethodManager inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
if(url2.isEmpty())
{
Toast.makeText(getActivity(), "Word is missing! ", Toast.LENGTH_LONG).show();
}
else
{
try{
urdu = dbHelper.getDetail(word.getText().toString());
urdu_meaning.setText(urdu.Meaning.toString());
}catch(Exception e){
e.printStackTrace();
urdu_meaning.setText("Urdu word not found");
}
if (mWifi.isConnected())
{
data.loadUrl(url1 + url2);
}
else
{
Toast.makeText(getActivity(), "Network Problem", Toast.LENGTH_LONG).show();
//wifiManager.setWifiEnabled(true);
}
}
}
});
return view;
}
片段[2]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.image, container, false);
imageView = (ImageView) view.findViewById(R.id.ImageView);
imageURL1 = imageURL + MeaningFragment.urlword + ".jpg";
// Execute the task
GetXMLTask task = new GetXMLTask();
task.execute(imageURL1);
return view;
}
片段[3]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.audio, container, false);
audioURL2 = MeaningFragment.urlword + ".mp3";
try{
if (isPlayed) { // if media player had played, this function is called
start();
}else {
try {
//pDialog.show();
mPlayer =new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(audioURL+audioURL2);
ac = new MediaController(getActivity());
ac.setAnchorView(view.findViewById(R.id.reference));
ac.setMediaPlayer(AudioFragment.this);
mPlayer.setOnCompletionListener(AudioFragment.this);
mPlayer.setOnPreparedListener(AudioFragment.this);
} catch (IOException e) {
//e.printStackTrace();
Toast.makeText(getActivity(), "Audio URL Not Found! ", Toast.LENGTH_LONG).show();
}
try {
mPlayer.prepare();
mPlayer.start();
}
catch (Exception e)
{
e.printStackTrace();
//urdu_meaning.setText("Audio Not Found");
Toast.makeText(getActivity(), "Audio not Found!", Toast.LENGTH_LONG).show();
}
}
}
和片段 [4] 使用相同的方法
FragmentPagerAdapter
的工作方式是加载您滚动到的目标的 Fragment
ahead。因此,当您启动应用程序时,片段 1 加载并显示,片段 2 加载并准备好显示。然后滑动时显示预加载的片段2,加载片段3。
因此,如果您希望代码在片段显示在视图分页器中时执行,您不能将此逻辑放入onCreateView()
。
如果您希望在显示片段时执行逻辑,您需要创建一个 ViewPager.OnPageChangeListener
并使用您的侦听器为视图寻呼机调用 ViewPager.setOnPageChangeListener()
。在您的 OnPageChangeListener
中,您实现了方法 onPageSelected
。这将告诉您片段何时通过滑动显示。 onPageSelected
的参数是显示的片段的索引,因此您可以判断哪个片段现在可见。
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int page) {
switch (page) {
case 0:
// code for first page displayed
break;
case 1:
// code for second page displayed
break;
case 2:
// code for third page displayed
break;
case 3:
// code for fourth page displayed
break;
}
}
// you also have to create empty impls for the other two methods
.
.
.
});
请注意:如果我没记错的话,onPageSelected
只会在滑动时被调用,所以它可能不会在您的视图寻呼机第一次显示时被调用。对于该事件,您可能必须从 creates/displays 您的视图寻呼机的方法中调用一些内容。
我有 Main activity 用于 setOnPageChangeListener 和另一个 activity (ViewpageAdapter) 用于 getItem.... 如下
ViewpagerAdpater
@Override
public Fragment getItem(int position) {
switch (position) {
// Open FragmentTab1.java
case 0:
MeaningFragment meaningtab = new MeaningFragment();
return meaningtab;
// Open FragmentTab2.java
case 1:
ImageFragment imagetab = new ImageFragment();
return imagetab;
case 2:
AudioFragment audiotab= new AudioFragment();
return audiotab;
case 3:
VideoFragment videotab = new VideoFragment();
return videotab;
}
return null;
}
MainActivity
// Adding Tabs
for (String tab_name : tabtitles) {
actionBar.addTab(actionBar.newTab().setText(tab_name)
.setTabListener(this));
}
/**
* on swiping the viewpager make respective tab selected
* */
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// on changing the page
// make respected tab selected
actionBar.setSelectedNavigationItem(position);
MainActivity.position = position;
Log.i("Position", "Meaning =" + position);
Log.i("Main Position", "Meaning =" + MainActivity.position);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
仍有问题。当我滑动标签时,我为每个片段设置位置日志,然后在 onpagelistner 中显示每个标签的准确位置,但在 [1] 和 [2] 中显示位置 0 和 [3] 在位置 1 和 [4] 在位置 2.
我现在有一个 activity 包含片段
[1] , [2] , [3] , [4]
一次启动应用程序 [1] 和 [2] 运行。
当滑动到 [2] 运行 [3] 并滑动到 [3] 运行 [4] 时。
任何人都可以帮助解决这个问题。
我想要 [1] 中的功能 [1]、[2] 中的 [2] 以及 [3] 中的 [3]、[4] 中的 [4] 选项卡滑动。
下面是我的代码 片段[1]:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.meaningview, container, false);
word = (EditText) view.findViewById(R.id.word);
data = (WebView) view.findViewById(R.id.web);
if(first == 1)
{
try {
dbHelper = new SqlLiteDbHelper(getActivity());
dbHelper.CopyDataBaseFromAsset();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
first++;
}
find.setOnClickListener(new OnClickListener() {
@SuppressWarnings("static-access")
@SuppressLint({ "NewApi", "DefaultLocale" })
@Override
public void onClick(View v) {
url2 = word.getText().toString().toLowerCase();
urlword = url2;
InputMethodManager inputManager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
if(url2.isEmpty())
{
Toast.makeText(getActivity(), "Word is missing! ", Toast.LENGTH_LONG).show();
}
else
{
try{
urdu = dbHelper.getDetail(word.getText().toString());
urdu_meaning.setText(urdu.Meaning.toString());
}catch(Exception e){
e.printStackTrace();
urdu_meaning.setText("Urdu word not found");
}
if (mWifi.isConnected())
{
data.loadUrl(url1 + url2);
}
else
{
Toast.makeText(getActivity(), "Network Problem", Toast.LENGTH_LONG).show();
//wifiManager.setWifiEnabled(true);
}
}
}
});
return view;
}
片段[2]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.image, container, false);
imageView = (ImageView) view.findViewById(R.id.ImageView);
imageURL1 = imageURL + MeaningFragment.urlword + ".jpg";
// Execute the task
GetXMLTask task = new GetXMLTask();
task.execute(imageURL1);
return view;
}
片段[3]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(R.layout.audio, container, false);
audioURL2 = MeaningFragment.urlword + ".mp3";
try{
if (isPlayed) { // if media player had played, this function is called
start();
}else {
try {
//pDialog.show();
mPlayer =new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setDataSource(audioURL+audioURL2);
ac = new MediaController(getActivity());
ac.setAnchorView(view.findViewById(R.id.reference));
ac.setMediaPlayer(AudioFragment.this);
mPlayer.setOnCompletionListener(AudioFragment.this);
mPlayer.setOnPreparedListener(AudioFragment.this);
} catch (IOException e) {
//e.printStackTrace();
Toast.makeText(getActivity(), "Audio URL Not Found! ", Toast.LENGTH_LONG).show();
}
try {
mPlayer.prepare();
mPlayer.start();
}
catch (Exception e)
{
e.printStackTrace();
//urdu_meaning.setText("Audio Not Found");
Toast.makeText(getActivity(), "Audio not Found!", Toast.LENGTH_LONG).show();
}
}
}
和片段 [4] 使用相同的方法
FragmentPagerAdapter
的工作方式是加载您滚动到的目标的 Fragment
ahead。因此,当您启动应用程序时,片段 1 加载并显示,片段 2 加载并准备好显示。然后滑动时显示预加载的片段2,加载片段3。
因此,如果您希望代码在片段显示在视图分页器中时执行,您不能将此逻辑放入onCreateView()
。
如果您希望在显示片段时执行逻辑,您需要创建一个 ViewPager.OnPageChangeListener
并使用您的侦听器为视图寻呼机调用 ViewPager.setOnPageChangeListener()
。在您的 OnPageChangeListener
中,您实现了方法 onPageSelected
。这将告诉您片段何时通过滑动显示。 onPageSelected
的参数是显示的片段的索引,因此您可以判断哪个片段现在可见。
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
public void onPageSelected(int page) {
switch (page) {
case 0:
// code for first page displayed
break;
case 1:
// code for second page displayed
break;
case 2:
// code for third page displayed
break;
case 3:
// code for fourth page displayed
break;
}
}
// you also have to create empty impls for the other two methods
.
.
.
});
请注意:如果我没记错的话,onPageSelected
只会在滑动时被调用,所以它可能不会在您的视图寻呼机第一次显示时被调用。对于该事件,您可能必须从 creates/displays 您的视图寻呼机的方法中调用一些内容。
我有 Main activity 用于 setOnPageChangeListener 和另一个 activity (ViewpageAdapter) 用于 getItem.... 如下
ViewpagerAdpater
@Override
public Fragment getItem(int position) {
switch (position) {
// Open FragmentTab1.java
case 0:
MeaningFragment meaningtab = new MeaningFragment();
return meaningtab;
// Open FragmentTab2.java
case 1:
ImageFragment imagetab = new ImageFragment();
return imagetab;
case 2:
AudioFragment audiotab= new AudioFragment();
return audiotab;
case 3:
VideoFragment videotab = new VideoFragment();
return videotab;
}
return null;
}
MainActivity
// Adding Tabs
for (String tab_name : tabtitles) {
actionBar.addTab(actionBar.newTab().setText(tab_name)
.setTabListener(this));
}
/**
* on swiping the viewpager make respective tab selected
* */
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// on changing the page
// make respected tab selected
actionBar.setSelectedNavigationItem(position);
MainActivity.position = position;
Log.i("Position", "Meaning =" + position);
Log.i("Main Position", "Meaning =" + MainActivity.position);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
仍有问题。当我滑动标签时,我为每个片段设置位置日志,然后在 onpagelistner 中显示每个标签的准确位置,但在 [1] 和 [2] 中显示位置 0 和 [3] 在位置 1 和 [4] 在位置 2.