2017-02-20 44 views
0

我在带有视图寻呼机和导航抽屉的选项卡中显示多个片段。 我定义了一个控制所有片段的TabFragment。
我想显示退出对话并完成应用程序。
但是当我按Back Button它显示空白屏幕。
我甚至评论了onbackpressed方法,但仍然显示当我按下后退按钮的空白屏幕。
我试过这个:Android onBackPressed() not working但是不能。OnBackPressed在Tabbed-FragmentActivity不能正常工作

主要活动

public class MainActivity extends AppCompatActivity { 
    Toolbar toolbar; 
    DrawerLayout mDrawerLayout; 
    NavigationView mNavigationView; 
    FragmentManager mFragmentManager; 
    FragmentTransaction mFragmentTransaction; 
    SharedPreferences preferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     preferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     if (toolbar != null) { 
      setSupportActionBar(toolbar); 
     } 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mNavigationView = (NavigationView) findViewById(R.id.main_drawer); 
     View headerView = LayoutInflater.from(this).inflate(R.layout.drawer_header, null); 
     mNavigationView.addHeaderView(headerView); 
     mNavigationView.getHeaderView(0).setVisibility(View.GONE); 

     int width = getResources().getDisplayMetrics().widthPixels/2; 
     DrawerLayout.LayoutParams params = (android.support.v4.widget.DrawerLayout.LayoutParams) mNavigationView.getLayoutParams(); 
     params.width = width; 

     mNavigationView.setLayoutParams(params); 
     mFragmentTransaction = mFragmentManager.beginTransaction(); 
     mFragmentTransaction.replace(R.id.frame_container, new TabFragment()).commit(); 

     mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
      @Override 
      public boolean onNavigationItemSelected(MenuItem menuItem) { 
       menuItem.setChecked(true); 
       mDrawerLayout.closeDrawers(); 
       if (menuItem.getItemId() == R.id.Top) { 
        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
        fragmentTransaction.replace(R.id.frame_container, new TabFragment()).commit(); 
       } 
       if (menuItem.getItemId() == R.id.Latest) { 
        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); 
        fragmentTransaction.replace(R.id.frame_container, new Fragment1()).commit(); 
       } 
       return false; 
      } 
     }); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close); 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 
     mDrawerToggle.syncState(); 
    } 

    @Override 
    public void onBackPressed() { 
     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawer(GravityCompat.START); 
     } else { 
      ExitDialogue(); 
      super.onBackPressed(); 
     } 
    } 

    public void ExitDialogue() { 
     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
     builder.setTitle(R.string.app_name); 
     builder.setIcon(R.mipmap.ic_launcher); 
     builder.setMessage("Do you want to exit?") 
       .setCancelable(false) 
       .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         finish(); 
        } 
       }) 
       .setNegativeButton("No", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         dialog.cancel(); 
        } 
       }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 
} 

的标签片段实际上在与图的寻呼机接片加载2个片段。

标签片段

public class TabFragment extends Fragment { 
    private TabLayout tabLayout; 
    private ViewPager viewPager; 
    private static int int_items = 2; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.tab_layout, container, false); 
     tabLayout = (TabLayout) v.findViewById(R.id.tabs); 
     viewPager = (ViewPager) v.findViewById(R.id.viewpager); 
     viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 
     viewPager.setOffscreenPageLimit(int_items - 1); 
     viewPager.setPageTransformer(true, new DepthPageTransformer()); 
     tabLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       tabLayout.setupWithViewPager(viewPager); 
      } 
     }); 
     return v; 
    } 

    class MyAdapter extends FragmentPagerAdapter { 
     MyAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return new Fragment1(); 
       case 1: 
        return new Fragment2(); 
      } 
      return null; 
     } 

     @Override 
     public int getCount() { 
      return int_items; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return getResources().getString(R.string.tab1); 
       case 1: 
        return getResources().getString(R.string.tab2); 
      } 
      return null; 
     } 
    } 
} 

回答

1
**CREATE YOUR MAINACTIVITY SUCH AS:** 

public class MainActivity extends AppCompatActivity { 

public ViewPager viewPager; 
private ArrayList<Fragment> allPagerData; 
    private MainactivityPagerAdapter mainAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 


     TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.addTab(tabLayout.newTab().setText("Fragment1")); 
     tabLayout.addTab(tabLayout.newTab().setText("Fragment1")); 

     tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

     viewPager = (ViewPager) findViewById(R.id.viewPager); 
     final PagerAdapter adapter = new PagerAdapter 
       (this.getSupportFragmentManager(), tabLayout.getTabCount()); 
     viewPager.setAdapter(adapter); 

     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
       Log.e("onTabReselected: ",":"+tab); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
       Log.e("onTabReselected: ",":"+tab); 
      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
       Log.e("onTabReselected: ",":"+tab); 
      } 
     }); 

     initViews(); 
    } 

    public void initViews(){ 

     createPager(); 

     mainAdapter = new MainactivityPagerAdapter(this.getSupportFragmentManager(), allPagerData); 
     viewPage.setAdapter(mainAdapter); 
     viewPager.setCurrentItem(0); 


     viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      } 

      @Override 
      public void onPageSelected(int position) { 


       if (position == allPagerData.size() - 1) { 
       } 
      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 
    } 

    @Override 
    public void createPager() { 
     allPagerData = new ArrayList<>(); 

     Fragment1 fragment1 = new Fragment1(); 
     allPagerData.add(fragment1); 

     Fragment2 fragment2 = new Fragment2(); 
     allPagerData.add(fragment2); 


    } 

     @Override 
    public void onBackPressed() { 
     if (viewPager.getCurrentItem() != 0) { 
      viewPager.setCurrentItem(viewPager.getCurrentItem() - 1); 
     }else { 
      super.onBackPressed();  
      // do whatever want to do if you want finished activity you can 
     } 
    } 
} 

=========================================== ===================

Your MainactivityPagerAdapter 


public class MainactivityPagerAdapter extends FragmentPagerAdapter { 

    private final ArrayList<Fragment> allFragments; 

    public MainactivityPagerAdapter(FragmentManager fm, ArrayList<Fragment> allFragments) { 
     super(fm); 
     this.allFragments = allFragments; 
    } 

    /** 
    * Return the Fragment associated with a specified position. 
    * 
    * @param position 
    */ 
    @Override 
    public Fragment getItem(int position) { 
     return allFragments.get(position); 
    } 

    /** 
    * Return the number of views available. 
    */ 
    @Override 
    public int getCount() { 

     return (allFragments != null) ? allFragments.size() : 0; 
    } 
} 

======================== ================================================= 你PagerAdapter

public class PagerAdapter extends FragmentStatePagerAdapter { 
    int mNumOfTabs; 

    public PagerAdapter(FragmentManager fm, int NumOfTabs) { 
     super(fm); 
     this.mNumOfTabs = NumOfTabs; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       Fragment1 tab1 = new Fragment1(); 
       return tab1; 
      case 1: 
       Fragment2 tab2 = new Fragment2(); 
       return tab2; 


      default: 
       return null; 
     } 
    } 

    @Override 
    public int getItemPosition(Object object) { 

     return super.getItemPosition(object); 
    } 

    @Override 
    public int getCount() { 
     return mNumOfTabs; 
    } 
} 
0

卸下onBackPressed super.onBackPressed();()和尝试。

+0

不工作...显示黑屏 –

0

问题

当我按后退按钮它显示黑屏。

试试这个。

@Override 
public void onBackPressed() { 
    // removed unnecessary view binding code. 
    if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { 
     mDrawerLayout.closeDrawer(GravityCompat.START); 
    } else { 
     ExitDialogue(); 
     //removed super.onBackPressed 
    } 
} 
+0

我已经尝试了上面的代码,但仍显示空白屏幕。 我甚至评论了onbackpressed方法,但它仍然显示空白屏幕。 –

+0

@OmerDanish你可以添加错误日志吗? –

0

让您的MainActivity是父母的活动来处理您的Tabfragment的问题是你的父母片段无法处理你的孩子tabfragment所以onbackpress不能在这里工作。

+0

我该怎么办?给出任何示例代码或参考 –

+0

我困在它上面...帮我 –

+0

@OmerDanish你试过我的代码片段和后备问题? –

0

既然你还没有发布日志,这些都是你可以检查东西..

  • 尝试使用onBackPress()方法中的断点来检查控件是否到达那里。
  • 如前面所述,绑定onCreate方法上的mDrawerLayout并将其设为公共变量。
  • 检查的片段和FragmentManager是v4.Fragment和v4.FragmentManager引用(必须是相同的)