2013-11-29 3 views
0

Я хочу изменить макет фрагмента при изменении поворота моего телефона. Но как-то недавний взгляд не наступает.Fragment Layout не меняется в OnConfiguration Change

Родительский вид удален, но новый вид не загружен. Он показывает белый экран. Это мой метод onConfig из класса Fragment.

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    // TODO Auto-generated method stub 
    super.onConfigurationChanged(newConfig); 




    System.out.println("On COnfiguration change has been called:--"); 
    LayoutInflater mCurrentinflater = getActivity().getLayoutInflater(); 
    ViewGroup mCurrentContainer = mContainer; 
    View currentView = mCurrentinflater.inflate(R.layout.rashi_grid, mContainer,false); 

    StaggeredGridView gridView = (StaggeredGridView)currentView.findViewById(R.id.gridview); 
    gridView.removeAllViews(); 

    ((ViewGroup) mCurrentContainer.getParent()).removeAllViews(); 
    View rootView = mCurrentinflater.inflate(R.layout.rashi_grid, mCurrentContainer, false); 

    mCurrentContainer.addView(rootView); 
    gridView.addView(View.inflate(currentView.getContext(), R.layout.rashi_grid, mCurrentContainer)); 

} 

Пожалуйста help..I есть два layout.the файл rashi_grid.xml расположен в разрешении \ папка расположения и еще один находится в разрешении \ макета земля folder.Please помощь

EDIT

Это мой HomeActivity.class

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

    setContentView(R.layout.myactivity_home); 

    mTitle = mDrawerTitle = getTitle(); 

    // load slide menu items 
    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items); 

    // nav drawer icons from resources 
    navMenuIcons = getResources() 
      .obtainTypedArray(R.array.nav_drawer_icons); 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu); 

    navDrawerItems = new ArrayList<NavDrawerItem>(); 

    // adding nav drawer items to array 
    // Home 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1))); 
    // Find People 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1))); 
    // Photos 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1))); 
    // Communities, Will add a counter here 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1))); 
    // Pages 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1))); 
    // What's hot, We will add a counter here 
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1))); 


    // Recycle the typed array 
    navMenuIcons.recycle(); 

    mDrawerList.setOnItemClickListener(new SlideMenuClickListener()); 

    // setting the nav drawer list adapter 
    adapter = new NavDrawerListAdapter(getApplicationContext(), 
      navDrawerItems); 
    mDrawerList.setAdapter(adapter); 

    // enabling action bar app icon and behaving it as toggle button 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
      R.drawable.ic_drawer, //nav menu toggle icon 
      R.string.app_name, // nav drawer open - description for accessibility 
      R.string.app_name // nav drawer close - description for accessibility 
    ) { 
     public void onDrawerClosed(View view) { 
      getActionBar().setTitle(mTitle); 
      // calling onPrepareOptionsMenu() to show action bar icons 
      invalidateOptionsMenu(); 
     } 

     public void onDrawerOpened(View drawerView) { 
      getActionBar().setTitle(mDrawerTitle); 
      // calling onPrepareOptionsMenu() to hide action bar icons 
      invalidateOptionsMenu(); 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (savedInstanceState == null) { 
     // on first time display view for first nav item 
     displayView(0); 
    } 





} 



@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    if (savedInstanceState != null && savedInstanceState.containsKey("booleanValue")) { 
     boolean myBoolean = savedInstanceState.getBoolean("booleanValue"); 
    } 
    super.onRestoreInstanceState(savedInstanceState); 
} 



@Override 
protected void onSaveInstanceState(Bundle outState) { 
    // TODO Auto-generated method stub 
    outState.putBoolean("booleanValue", true); 
} 



/** 
* Slide menu item click listener 
* */ 
private class SlideMenuClickListener implements 
     ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     // display view for selected nav drawer item 

     displayView(position); 
    } 
} 



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // TODO Auto-generated method stub 
    getMenuInflater().inflate(R.menu.home, menu); 
    return true; 
} 



@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // toggle nav drawer on selecting action bar app icon/title 
    System.out.println("Item Id:-"+item.getTitle()); 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    // Handle action bar actions click 
    switch (item.getItemId()) { 
    case R.id.action_settings: 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

/*** 
* Called when invalidateOptionsMenu() is triggered 
*/ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    // if nav drawer is opened, hide the action items 
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
    menu.findItem(R.id.action_settings).setVisible(!drawerOpen); 
    return super.onPrepareOptionsMenu(menu); 
} 

/** 
* Diplaying fragment view for selected nav drawer list item 
* */ 
private void displayView(int position) { 
    // update the main content by replacing fragments 

    Fragment fragment = null; 


    switch (position) { 
    case 0: 
     fragment = new AFragment(); 
     break; 

    case 1: 
     fragment = new BFragment(); 
     break; 

    default: 
     break; 
    } 

    if (fragment != null) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.frame_container, fragment).commit(); 

     // update selected item and title, then close the drawer 
     mDrawerList.setItemChecked(position, true); 
     mDrawerList.setSelection(position); 
     setTitle(navMenuTitles[position]); 
     mDrawerLayout.closeDrawer(mDrawerList); 
     //fragmentManager.popBackStack(); 
    } else { 
     // error in creating fragment 
     Log.e("MainActivity", "Error in creating fragment"); 
    } 
} 

@Override 
public void setTitle(CharSequence title) { 
    mTitle = title; 
    getActionBar().setTitle(mTitle); 
} 

/** 
* When using the ActionBarDrawerToggle, you must call it during 
* onPostCreate() and onConfigurationChanged()... 
*/ 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 

    @Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Pass any configuration change to the drawer toggls 

    mDrawerToggle.onConfigurationChanged(newConfig); 


    } 



} 

Это мой BFragment

@Override 
// Called when the fragment is created. 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 




    mContainer = container; 

    // Inflation of the fragment layout. 
    View rootView = inflater.inflate(R.layout.rashi_grid, container, false);  

    BImageAdapter adapter = new BImageAdapter(getActivity()); 


    StaggeredGridView gridView = (StaggeredGridView) rootView.findViewById(R.id.gridview); 
    //GridView gridView = (GridView) rootView.findViewById(R.id.gridview); 
    gridView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(StaggeredGridView parent, View view, int position, 
       long id) { 
      // TODO Auto-generated method stub 
      Intent product = new Intent(getActivity(),productActivity.class); 
      product.putExtra("productname", position); 
      startActivity(product); 
      getActivity().finish(); 
     } 
    }); 

    gridView.setAdapter(adapter); 
    return rootView; 
} 

Это мой BimageAdapter

@Override 
public View getView(int position, View v, ViewGroup parent) { 


    ViewHolder vh; 

    if (v == null) 
    { 
    vh = new ViewHolder(); 
    v = mInflater.inflate(R.layout.row_grid,parent,false); 
    vh.productname = (TextView)v.findViewById(R.id.productname); 
    vh.productprice = (TextView)v.findViewById(R.id.product_price); 
    vh.productpricedetails = (TextView)v.findViewById(R.id.product_pricedetails); 
    vh.imageView = (ImageView)v.findViewById(R.id.grid_item_image); 

    v.setTag(vh); 
    } 
    else 
    { 
    vh = (ViewHolder) v.getTag(); 
    }  

    vh.productpricedetails.setText(productprice[position]); 
    vh.productname.setText(productName[position]); 
    vh.imageView.setImageResource(ImageId[position]); 
    vh.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 






    return v; 
} 

ответ

0

Для того, чтобы изменить расположение фрагмента, вы должны, а не использовать onConfigurationChanged. Пусть активность и фрагменты будут уничтожены и воссозданы, а инфляция макета в действии onCreate.

Еще лучше, вы можете просто определить свои макеты для пейзажа и портрета в соответствующих папках (layout-land и layout-port) с тем же именем файла. Таким образом, он автоматически подберет правильный макет, если вы не сделаете никакого кода (до тех пор, пока активность и фрагменты будут воссозданы).

+0

в моем классе активности, если я переопределить ONCONFIG метод, то макет не changing..its получать такое же расположение, только ширина expanding.But я имеют разные взгляды на ландшафт и Портретная – Chiradeep

+0

Вы используете 'onConfigurationChanged' если вы DON «T хочу перезапустить свою деятельность. Это то, что вы хотите? Вы делаете это только в том случае, если у вас есть веская причина. – Szymon

+0

Да, я не хочу перезапускать свою деятельность. Просто я хочу изменить макет с покрова на пейзаж. но почему-то его не происходит – Chiradeep

0
  1. Когда мы меняем ориентацию, фрагменты воссозданы. Поэтому, когда мы хотим, чтобы не вызывать OnCreate об изменении ориентации мы переопределять метод (onConfiguration) 2.Если вы не хотите рестарт активности, когда ориентация изменилась, Declare данный тег в Menifest

// Написание этого тега в манифесте необходимо, чтобы приложение обрабатывало дескриптор изменения конфигурации вместо andandroid.

андроид: configChanges = "ориентация | Размер экран | клавиатура | keyboardHidden" или андроид: configChanges = "ориентация | keyboardHidden"

  1. Чтобы изменить расположение в изменении конфигурации заменить ниже заданный код. В вашем коде выполните одно из проверок изменений ориентации в OnConfigurationChanged.

    @Override общественных недействительный onConfigurationChanged (Конфигурация newConfig) { супер.onConfigurationChanged (newConfig);

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 
    { 
        setContentView(R.layout.listslandscape); 
    } 
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) 
    { 
        setContentView(R.layout.listsportrait); 
    } 
    

    }

, чтобы узнать больше вы можете перейти на андроид сайт разработчика. http://developer.android.com/guide/topics/resources/runtime-changes.html

Смежные вопросы