1

我是新来的android编程,我需要帮助:我需要拦截Fragment中的按钮以显示退出警报对话框。我试着用都和onBackPressed onkeydown事件,但他们不工作,我不知道为什么...... 这里是一些代码:如何拦截片段中的后退按钮?

public class Home extends Fragment { 
    private Dialog dialog; 
    // onAttach : set activity listener 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     // if implemented by activity, set listener 
     // else create local listener (code never executed in this example) 
    } 

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

     // fragment not when container null 
     if (container == null) { 
     return null; 
     } 
     // inflate view from layout 
     final View view = inflater.inflate(R.layout.home,container,false); 

     ... 

     //onBackPressed(); doesn't work, alertDialog comes up only the first time without touching back button 
     return view; 
    } 

我“onBackPressed” ......

public void onBackPressed() { 
      new AlertDialog.Builder(getActivity()) 
       .setIcon(android.R.drawable.ic_dialog_alert) 
       .setTitle("Hey!") 
       .setMessage("Exit?") 
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        FragmentActivity i=getActivity(); 
        i.finish(); 
       } 

      }) 
      .setNegativeButton("No", null) 
      .show(); 
     } 

    } 

这里还PagerTabsActivity和PagerAdapter,如果你需要... PagerTabsActivity:

public class PagerTabsActivity extends FragmentActivity { 
    private static int i=0; 
    private static View pagerStrip; 
    // list contains fragments to instantiate in the viewpager 
    List<Fragment> fragments = new Vector<Fragment>(); 
    List<String> fragmentTitles = new Vector<String>(); 
    // page adapter between fragment list and view pager 
    private PagerAdapter mPagerAdapter; 
    // view pager 
    private ViewPager mViewPager; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     // creating fragments and adding to list 
     fragments.add(Fragment.instantiate(this, Home.class.getName())); 
     fragmentTitles.add(Home.class.getSimpleName()); 
     fragments.add(Fragment.instantiate(this, Second.class.getName())); 
     fragmentTitles.add(Second.class.getSimpleName()); 
     fragments.add(Fragment.instantiate(this, Third.class.getName())); 
     fragmentTitles.add(Third.class.getSimpleName()); 
     // 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     pagerStrip = findViewById(R.id.pagerTabStrip); 
     if (pagerStrip instanceof PagerTabStrip) { 
      PagerTabStrip pagerTabStrip = (PagerTabStrip) pagerStrip; 
      pagerTabStrip.setDrawFullUnderline(true); 
      pagerTabStrip.setTabIndicatorColorResource(android.R.color.white); 
      // pagerTabStrip.setTextColor(color.white); 
     } else if (pagerStrip instanceof PagerTitleStrip) { 
      PagerTitleStrip pagerTitleStrip = (PagerTitleStrip) pagerStrip; 
      pagerTitleStrip.setTextColor(getResources().getColor(android.R.color.white)); 
     } 

     this.mPagerAdapter = new PagerAdapter(super.getSupportFragmentManager(), fragments); 
     mViewPager.setAdapter(this.mPagerAdapter); 
     mViewPager.setCurrentItem(0); 
    } 
} 

PagerAdapter:

public class PagerAdapter extends FragmentPagerAdapter { 
    // private String titles[] = new String[] { "Tab1", "Tab2", "Tab3" }; 
    private List<String> fragmentTitles; 
    private List<Fragment> fragments; 

    public PagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
     super(fm); 
     this.fragments = fragments; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 

     if (null == fragmentTitles || fragmentTitles.size() <= position) { 
      return " "; 
     } 
     String fragTitle = fragmentTitles.get(position); 
     if (null == fragTitle || fragTitle.trim().length() == 0) { 
      return "No Title"; 
     } 
     // Log.v("TitleAdapter - getPageTitle=", fragmentTitles.get(position)); 
     return fragmentTitles.get(position); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // Log.v("TitleAdapter - getItem=", String.valueOf(position)); 
     return this.fragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return this.fragments.size(); 
    } 

} 

任何帮助将不胜感激! :)

+3

“显示的退出警报的对话” - 这是一个坏主意,只是因为不管你的数据是试图在这里保存可能以其他方式丢失(例如,用户按HOME)。请不要用这样的对话中断用户。相反,如果您认为尚未准备好应用到主数据存储区,则可以将任何未完成的数据保存到临时点,并在用户返回到您的应用时告知用户该临时数据。 – CommonsWare 2013-05-12 12:43:23

+0

非常感谢这个建议:)我会牢记它!顺便说一句,我只用交互式模型做一个非常简单的应用程序,所以现在我只想知道如何解决这个问题! – Kurtis92 2013-05-12 15:01:22

回答

0

你需要覆盖的方法..尝试这个代码:

@Override 
public void onBackPressed() { 
    new AlertDialog.Builder(this) 
     .setTitle("Exit") 
     .setMessage("Are you sure you want to exit?") 
     .setNegativeButton("No", null) 
     .setPositiveButton("Get me out!", new OnClickListener() { 

      public void onClick(DialogInterface arg0, int arg1) { 
       FragmentActivity i=getActivity(); 
       i.finish(); 
      } 
     }).create().show(); 
} 
+0

是的,我已经尝试过了,我已经发布了一个非常类似的代码...我将编辑第一篇文章以更好地展示它! – Kurtis92 2013-05-12 12:57:09