如何处理Android片段中的后退按钮(How to handle Back Button press in android fragments)

编程入门 行业动态 更新时间:2024-10-23 20:21:52
如何处理Android片段中的后退按钮(How to handle Back Button press in android fragments)

我有一个扩展片段的类。 它从服务器接收数据并加载片段布局。 数据来自AsyncTask doInBackground。 但是我遇到的问题是,如果asynctask仍然在后台执行并且用户按下后退按钮,我的应用程序将转到另一个活动。 但是当asynctask完成时,它找不到所需的布局,从而导致应用程序崩溃。 当用户在后台执行中间按下后退按钮时,如何取消此异步任务,更重要的是,如何在片段中按下后退。

这是我的代码:

TabsPagerAdapter.java

public class TabsPagerAdapter extends FragmentPagerAdapter { public TabsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int index) { switch (index) { case 0: // Top Rated fragment activity return new TopStoriesFragment(); case 1: // Games fragment activity return new NationalFragment(); case 2: // Movies fragment activity return new InternationalFragment(); case 3: // Movies fragment activity return new SportsFragment(); case 4: // Movies fragment activity return new TechnologyFragment(); case 5: // Movies fragment activity return new BusinessFragment(); case 6: // Movies fragment activity return new EntertainmentFragment(); } return null; } @Override public int getCount() { // get item count - equal to number of tabs return 7; } public void stop() { // get item count - equal to number of tabs return; } }

MainActivity.java

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { private ViewPager viewPager; private TabsPagerAdapter mAdapter; private ActionBar actionBar; // Tab titles private String[] tabs = { "Top Stories", "National", "International", "Sports", "Technology", "Business", "Entertainment"}; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.pager); actionBar = getActionBar(); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); actionBar.setHomeButtonEnabled(false); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Adding Tabs for (String tab_name : tabs) { 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); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } }

BusinessFragment.java

public class BusinessFragment extends Fragment { public String thehindu = "xxxxx"; public String toi = "xxxxx"; public String hindustantimes = "xxxxx"; public String indianexpress = "xxxxxx"; public String reuters = "xxxxxxx"; public String dainikjagaran = "xxxxxx"; public String dainikbhaskar = "xxxxx"; public String amarujala = "xxxxxx"; public String currenturl; AlertDialog levelDialog; public LayoutInflater inflater; ListView listView; int mCurCheckPosition; SharedPreferences sp; String papername; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_data, container, false); sp = getActivity().getSharedPreferences("myfile", getActivity().MODE_PRIVATE); papername = sp.getString("Newspaper_name", null); feedTitle = (TextView) rootView.findViewById(R.id.feedtitle); feedDescribtion = (TextView) rootView .findViewById(R.id.feeddescribtion); getCurrentURL(); listView = (ListView) rootView.findViewById(android.R.id.list); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { Intent intent = new Intent(getActivity(), ShowDetails.class); Bundle bundle = new Bundle(); bundle.putString("keyTitle", myRssFeed.getItem(position) .getTitle()); bundle.putString("keyDescription", myRssFeed.getItem(position) .getDescription()); bundle.putString("keyLink", myRssFeed.getItem(position) .getLink()); bundle.putString("keyPubdate", myRssFeed.getItem(position) .getPubdate()); intent.putExtras(bundle); startActivity(intent); } }); startReadRss(); return rootView; } public class RssLoadingTask extends AsyncTask<Void, Void, Void> { @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub displayRss(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub preReadRss(); } @Override protected void onProgressUpdate(Void... values) { // TODO Auto-generated method stub // super.onProgressUpdate(values); } @Override protected Void doInBackground(Void... arg0) { // TODO Auto-generated method stub readRss(); return null; } } private RSSFeed myRssFeed = null; TextView feedTitle; TextView feedDescribtion; // TextView feedPubdate; // TextView feedLink; public class MyCustomAdapter extends ArrayAdapter<RSSItem> { public MyCustomAdapter(Context context, int textViewResourceId, List<RSSItem> list) { super(context, textViewResourceId, list); } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub // return super.getView(position, convertView, parent); View row = convertView; if (row == null) { inflater = LayoutInflater.from(getActivity()); row = inflater.inflate(R.layout.row, parent, false); } TextView listTitle = (TextView) row.findViewById(R.id.listtitle); listTitle.setText(myRssFeed.getList().get(position).getTitle()); TextView listPubdate = (TextView) row .findViewById(R.id.listpubdate); listPubdate.setText(myRssFeed.getList().get(position).getPubdate()); return row; } } private void startReadRss() { new RssLoadingTask().execute(); } private void getCurrentURL() { if (papername.equalsIgnoreCase("The Times of India")) { currenturl = toi; } else if (papername.equalsIgnoreCase("The Hindu")) { currenturl = thehindu; } else if (papername.equalsIgnoreCase("The Hindustan Times")) { currenturl = hindustantimes; } else if (papername.equalsIgnoreCase("The Indian Express")) { currenturl = indianexpress; } else if (papername.equalsIgnoreCase("Reuters")) { currenturl = reuters; } else if (papername.equalsIgnoreCase("दैनिक जागरण")) { currenturl = dainikjagaran; } else if (papername.equalsIgnoreCase("दैनिक भास्कर")) { currenturl = dainikbhaskar; } else if (papername.equalsIgnoreCase("अमर उजाला")) { currenturl = amarujala; } // else if(papername.equalsIgnoreCase("Times of India")) // { // // } // else if(papername.equalsIgnoreCase("Times of India")) // { // // } // } private void preReadRss() { feedTitle.setText("--- wait ---"); feedDescribtion.setText(""); // feedPubdate.setText(""); // feedLink.setText(""); listView.setAdapter(null); // Toast.makeText(getActivity(), "Reading RSS, Please wait.", // Toast.LENGTH_LONG) // .show(); } private void readRss() { try { URL rssUrl = new URL(currenturl); SAXParserFactory mySAXParserFactory = SAXParserFactory .newInstance(); SAXParser mySAXParser = mySAXParserFactory.newSAXParser(); XMLReader myXMLReader = mySAXParser.getXMLReader(); RSSHandler myRSSHandler = new RSSHandler(); myXMLReader.setContentHandler(myRSSHandler); InputSource myInputSource = new InputSource(rssUrl.openStream()); myXMLReader.parse(myInputSource); myRssFeed = myRSSHandler.getFeed(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void displayRss() { if (myRssFeed != null) { Calendar c = Calendar.getInstance(); // String strCurrentTiime = "\n(Time of Reading - " // + c.get(Calendar.HOUR_OF_DAY) // + " Hrs. : " // + c.get(Calendar.MINUTE) + " Mins.)\n" +c.get(Calendar.AM_PM); SimpleDateFormat sdf = new SimpleDateFormat( "MMMM-dd-yyyy HH:mm:ss a"); String strCurrentTiime = sdf.format(c.getTime()); feedTitle.setText(papername); feedDescribtion.setText(strCurrentTiime); // feedPubdate.setText(myRssFeed.getPubdate()); // feedLink.setText(myRssFeed.getLink()); MyCustomAdapter adapter = new MyCustomAdapter(getActivity(), R.layout.row, myRssFeed.getList()); listView.setAdapter(adapter); } } }

I have a class which extends fragment. It receives a data from server and loads on the fragment layout. The data comes from AsyncTask doInBackground. But I am facing a problem that if asynctask is still doing in background and user presses back button, my app goes to another activity. But when the asynctask finishes, it does not find the needed layout and hence crashes the app. How to cancel this async task when user presses the back button in the middle of do in background, and more importantly, how to call on back pressed in fragments.

Here is my code:

TabsPagerAdapter.java

public class TabsPagerAdapter extends FragmentPagerAdapter { public TabsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int index) { switch (index) { case 0: // Top Rated fragment activity return new TopStoriesFragment(); case 1: // Games fragment activity return new NationalFragment(); case 2: // Movies fragment activity return new InternationalFragment(); case 3: // Movies fragment activity return new SportsFragment(); case 4: // Movies fragment activity return new TechnologyFragment(); case 5: // Movies fragment activity return new BusinessFragment(); case 6: // Movies fragment activity return new EntertainmentFragment(); } return null; } @Override public int getCount() { // get item count - equal to number of tabs return 7; } public void stop() { // get item count - equal to number of tabs return; } }

MainActivity.java

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { private ViewPager viewPager; private TabsPagerAdapter mAdapter; private ActionBar actionBar; // Tab titles private String[] tabs = { "Top Stories", "National", "International", "Sports", "Technology", "Business", "Entertainment"}; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.pager); actionBar = getActionBar(); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); actionBar.setHomeButtonEnabled(false); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Adding Tabs for (String tab_name : tabs) { 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); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } }

BusinessFragment.java

public class BusinessFragment extends Fragment { public String thehindu = "xxxxx"; public String toi = "xxxxx"; public String hindustantimes = "xxxxx"; public String indianexpress = "xxxxxx"; public String reuters = "xxxxxxx"; public String dainikjagaran = "xxxxxx"; public String dainikbhaskar = "xxxxx"; public String amarujala = "xxxxxx"; public String currenturl; AlertDialog levelDialog; public LayoutInflater inflater; ListView listView; int mCurCheckPosition; SharedPreferences sp; String papername; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_data, container, false); sp = getActivity().getSharedPreferences("myfile", getActivity().MODE_PRIVATE); papername = sp.getString("Newspaper_name", null); feedTitle = (TextView) rootView.findViewById(R.id.feedtitle); feedDescribtion = (TextView) rootView .findViewById(R.id.feeddescribtion); getCurrentURL(); listView = (ListView) rootView.findViewById(android.R.id.list); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { Intent intent = new Intent(getActivity(), ShowDetails.class); Bundle bundle = new Bundle(); bundle.putString("keyTitle", myRssFeed.getItem(position) .getTitle()); bundle.putString("keyDescription", myRssFeed.getItem(position) .getDescription()); bundle.putString("keyLink", myRssFeed.getItem(position) .getLink()); bundle.putString("keyPubdate", myRssFeed.getItem(position) .getPubdate()); intent.putExtras(bundle); startActivity(intent); } }); startReadRss(); return rootView; } public class RssLoadingTask extends AsyncTask<Void, Void, Void> { @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub displayRss(); } @Override protected void onPreExecute() { // TODO Auto-generated method stub preReadRss(); } @Override protected void onProgressUpdate(Void... values) { // TODO Auto-generated method stub // super.onProgressUpdate(values); } @Override protected Void doInBackground(Void... arg0) { // TODO Auto-generated method stub readRss(); return null; } } private RSSFeed myRssFeed = null; TextView feedTitle; TextView feedDescribtion; // TextView feedPubdate; // TextView feedLink; public class MyCustomAdapter extends ArrayAdapter<RSSItem> { public MyCustomAdapter(Context context, int textViewResourceId, List<RSSItem> list) { super(context, textViewResourceId, list); } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub // return super.getView(position, convertView, parent); View row = convertView; if (row == null) { inflater = LayoutInflater.from(getActivity()); row = inflater.inflate(R.layout.row, parent, false); } TextView listTitle = (TextView) row.findViewById(R.id.listtitle); listTitle.setText(myRssFeed.getList().get(position).getTitle()); TextView listPubdate = (TextView) row .findViewById(R.id.listpubdate); listPubdate.setText(myRssFeed.getList().get(position).getPubdate()); return row; } } private void startReadRss() { new RssLoadingTask().execute(); } private void getCurrentURL() { if (papername.equalsIgnoreCase("The Times of India")) { currenturl = toi; } else if (papername.equalsIgnoreCase("The Hindu")) { currenturl = thehindu; } else if (papername.equalsIgnoreCase("The Hindustan Times")) { currenturl = hindustantimes; } else if (papername.equalsIgnoreCase("The Indian Express")) { currenturl = indianexpress; } else if (papername.equalsIgnoreCase("Reuters")) { currenturl = reuters; } else if (papername.equalsIgnoreCase("दैनिक जागरण")) { currenturl = dainikjagaran; } else if (papername.equalsIgnoreCase("दैनिक भास्कर")) { currenturl = dainikbhaskar; } else if (papername.equalsIgnoreCase("अमर उजाला")) { currenturl = amarujala; } // else if(papername.equalsIgnoreCase("Times of India")) // { // // } // else if(papername.equalsIgnoreCase("Times of India")) // { // // } // } private void preReadRss() { feedTitle.setText("--- wait ---"); feedDescribtion.setText(""); // feedPubdate.setText(""); // feedLink.setText(""); listView.setAdapter(null); // Toast.makeText(getActivity(), "Reading RSS, Please wait.", // Toast.LENGTH_LONG) // .show(); } private void readRss() { try { URL rssUrl = new URL(currenturl); SAXParserFactory mySAXParserFactory = SAXParserFactory .newInstance(); SAXParser mySAXParser = mySAXParserFactory.newSAXParser(); XMLReader myXMLReader = mySAXParser.getXMLReader(); RSSHandler myRSSHandler = new RSSHandler(); myXMLReader.setContentHandler(myRSSHandler); InputSource myInputSource = new InputSource(rssUrl.openStream()); myXMLReader.parse(myInputSource); myRssFeed = myRSSHandler.getFeed(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void displayRss() { if (myRssFeed != null) { Calendar c = Calendar.getInstance(); // String strCurrentTiime = "\n(Time of Reading - " // + c.get(Calendar.HOUR_OF_DAY) // + " Hrs. : " // + c.get(Calendar.MINUTE) + " Mins.)\n" +c.get(Calendar.AM_PM); SimpleDateFormat sdf = new SimpleDateFormat( "MMMM-dd-yyyy HH:mm:ss a"); String strCurrentTiime = sdf.format(c.getTime()); feedTitle.setText(papername); feedDescribtion.setText(strCurrentTiime); // feedPubdate.setText(myRssFeed.getPubdate()); // feedLink.setText(myRssFeed.getLink()); MyCustomAdapter adapter = new MyCustomAdapter(getActivity(), R.layout.row, myRssFeed.getList()); listView.setAdapter(adapter); } } }

最满意答案

我想你可以这样做:

创建一个通用片段:

public abstract class extends BaseFragment { public abstract boolean onBackPressed(); }

在他的Fragments中,扩展了这个BaseFragment,例如:

public class TopStoriesFragment extends BaseFragment { ... @Override public boolean onBackPressed() { //if you return false, then it is because you have not consumed //the event, but if it returns true, which is consumed by this event. return false; } }

在他的MainActivity活动中,您应该检查onBackPressed事件,如果事件被消费,则决定做什么。

保存当前选项卡非常重要!

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { //It is very important that you save the current tab! private BaseFragment currentTab; // ... implementation public class TabsPagerAdapter extends FragmentPagerAdapter { public TabsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int index) { currentTab = null; switch (index) { case 0: // Top Rated fragment activity currentTab = new TopStoriesFragment(); break; case 1: // Games fragment activity return new NationalFragment(); case 2: // Movies fragment activity currentTab = new InternationalFragment(); break; case 3: // Movies fragment activity currentTab = new SportsFragment(); break; case 4: // Movies fragment activity currentTab = new TechnologyFragment(); case 5: // Movies fragment activity currentTab = new BusinessFragment(); break; case 6: // Movies fragment activity currentTab = new EntertainmentFragment(); break; } return currentTab; } @Override public int getCount() { // get item count - equal to number of tabs return 7; } public void stop() { // get item count - equal to number of tabs return; } } @Override public void onBackPressed() { //If the event returned false, then call the super. if(currentTab == null || !currentTab.onBackPressed()) super.onBackPressed(); } }

改变你的情况!

I think you can do this:

Create a generic Fragment:

public abstract class extends BaseFragment { public abstract boolean onBackPressed(); }

In his Fragments, extends this BaseFragment, example:

public class TopStoriesFragment extends BaseFragment { ... @Override public boolean onBackPressed() { //if you return false, then it is because you have not consumed //the event, but if it returns true, which is consumed by this event. return false; } }

In his MainActivity activity, you should check in onBackPressed event, if the event was consumed or not, to decide what to do.

It is very important that you save the current tab!

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { //It is very important that you save the current tab! private BaseFragment currentTab; // ... implementation public class TabsPagerAdapter extends FragmentPagerAdapter { public TabsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int index) { currentTab = null; switch (index) { case 0: // Top Rated fragment activity currentTab = new TopStoriesFragment(); break; case 1: // Games fragment activity return new NationalFragment(); case 2: // Movies fragment activity currentTab = new InternationalFragment(); break; case 3: // Movies fragment activity currentTab = new SportsFragment(); break; case 4: // Movies fragment activity currentTab = new TechnologyFragment(); case 5: // Movies fragment activity currentTab = new BusinessFragment(); break; case 6: // Movies fragment activity currentTab = new EntertainmentFragment(); break; } return currentTab; } @Override public int getCount() { // get item count - equal to number of tabs return 7; } public void stop() { // get item count - equal to number of tabs return; } } @Override public void onBackPressed() { //If the event returned false, then call the super. if(currentTab == null || !currentTab.onBackPressed()) super.onBackPressed(); } }

Change to your case!

更多推荐

本文发布于:2023-08-05 03:27:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1427211.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:如何处理   片段   按钮   Android   handle

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!