2014-12-04 5 views
0

Я создал DrawerLayout, он отлично работает. Этот DrawerLayout открывает Фрагменты, и я не создал FragmentActivity для управления своими фрагментами.FragmentActivity и DrawerLayout?

В моем приложении у меня есть активность, которая выполняет вход в систему, если логин в порядке. Я запускаю активность DrawerLayout. Теперь мне нужно контролировать «назад» моих фрагментов, например, в некоторых фрагментах мне нужно остановить возврат устройства.

1 - ФрагментАктивность действительно необходимо создать?

2 - Как я могу остановить фрагмент с помощью функции FragmentActivity?

3 - Если мне нужно создать FragmentActivity, как я могу добавить DrawerLayout?

XML DrawerLayout

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/dl" 
    > 

    <FrameLayout 
     android:id="@+id/fl" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"  
     >  
    </FrameLayout> 

    <ListView 
     android:id="@+id/lv" 
     android:layout_width="250dp" 
     android:layout_height="match_parent" 
     android:choiceMode="singleChoice" 
     android:divider="#e9ba68" 
     android:paddingLeft="5dp" 
     android:paddingRight="5dp" 
     android:dividerHeight="1dp" 
     android:background="#ac453c" 
     android:layout_gravity="start" 
     > 

    </ListView> 

</android.support.v4.widget.DrawerLayout> 

DrawerLayout

public class CustomDrawerLayout extends ActionBarActivity implements OnItemClickListener{ 
    private ActionBar ab; 
    private DrawerLayout dl; 
    private ListView lv; 
    private ActionBarDrawerToggle tg; 

    private List<ItensListView> fragments; 
    private CharSequence tl; //titulo principal 
    private CharSequence tlf; //titulo fragment 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_custom_drawerlayout); 
     init(); 

     if(savedInstanceState == null){ 
      selectedItem(0); 
     } 
    } 

    private void init(){ 
     //actionbar 
     onConfigActionBar(); 
     //listview 
     configItensListView(); 
     lv = (ListView)findViewById(R.id.lv);    
     lv.setAdapter(new DrawerLayoutListViewAdapter(this, fragments)); 
     lv.setOnItemClickListener(this);   
     //drawerlayout 
     dl = (DrawerLayout)findViewById(R.id.dl); 
     //actionbardrawertoggle 
     tg = new ActionBarDrawerToggle(this, dl, R.drawable.btmenu, R.string.nomeActionBar){ 
      public void onDrawerClosed(View view) { 
       ab.setTitle(tl);     
       supportInvalidateOptionsMenu(); 
      } 

      public void onDrawerOpened(View view) { 
       ab.setTitle(tlf); 
       supportInvalidateOptionsMenu(); 
      } 
     };  
     dl.setDrawerListener(tg); 

     tl = tlf = getTitle();  
    } 

    /** ativa actionbar e botao home na action bar */ 
    private void onConfigActionBar(){ 
     ab = getSupportActionBar(); 
     ab.setDisplayHomeAsUpEnabled(true); 
     ab.setHomeButtonEnabled(true); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     tg.onConfigurationChanged(newConfig); 
    } 

    /** necessario */ 
    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     tg.syncState(); 
    } 

    /** necessario */ 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) {   
     if (tg.onOptionsItemSelected(item)) { 
      return true; 
     }    
     return super.onOptionsItemSelected(item); 
    } 


    /** necessario */ 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.custom_drawer_layout, menu); 
     return true; 
    } 

    /** necessario */ 
    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     boolean status = dl.isDrawerOpen(lv); 
     menu.findItem(R.id.action_settings).setVisible(!status); 
     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position,long id) { 
     selectedItem(position);  
    } 

    /** open fragments */ 
    private void selectedItem(int position){ 
     FragmentTransaction ft; 
     Fragment frag; 
     switch(position){ 
      case 0: 
       //frag = new InicioFrag(); 
       frag = new InicioFrag(); 
       ft = getSupportFragmentManager().beginTransaction(); 
       ft.replace(R.id.fl, frag); 
       ft.addToBackStack("back"); 
       ft.commit(); 
       break; 
      case 1: 
       frag = new ApresentacaoFrag(); 
       ft = getSupportFragmentManager().beginTransaction(); 
       ft.replace(R.id.fl, frag); 
       ft.addToBackStack("back"); 
       ft.commit(); 
       break; 
      case 3: 
       frag = new PerfilFrag(); 
       ft = getSupportFragmentManager().beginTransaction(); 
       ft.replace(R.id.fl, frag); 
       ft.addToBackStack("back"); 
       ft.commit(); 
       break; 

     } 

Войти Активность

public class LoginView extends Activity implements OnClickListener{ 
    private EditText etEmail; 
    private EditText etSenha; 
    private Button btCadastrar; 
    private Button btEntrar; 
    private Button btEsqueci; 
    private Intent intentCadastrar; 
    private Intent intentEsqueci; 
    private Intent intentInicio; 
    private ProgressDialog progress; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) {   
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE);//remove barra de titulos 
     setContentView(R.layout.login); 

    private void doLogin(){ 
     if(etEmail.getText().toString().isEmpty() || etSenha.getText().toString().isEmpty()){ 
      Toast.makeText(this, "Informe todos os campos", Toast.LENGTH_SHORT).show(); 
     }else{ 
      progress = new CustomProgressDialog().getCustomProgress(null, LoginView.this); 
      progress.show(); 

      Usuario usuario = new Usuario(); 
      usuario.setEmail(etEmail.getText().toString()); 
      usuario.setSenha(etSenha.getText().toString()); 
      ApplicationController app = new UsuarioDAO().isUsuarioLogin(
                 usuario, 
                 new UsuarioAdapter(){ 
                  @Override 
                  public void usuarioIsLogin(Boolean result) { 
                   if(!result){ 
                    Toast.makeText(getApplicationContext(), "Email ou senha inválido", Toast.LENGTH_SHORT).show();; 
                   }else{                 
                    startActivity(new Intent(getApplicationContext(), CustomDrawerLayout.class)); 
                    finish(); 
                   } 
                   progress.dismiss(); 
                 } 

      }); 
      CustomVolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(app);   
     } 
    } 
} 

Фрагмент

public class ApresentacaoFrag extends Fragment{ 

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

     View view = inflater.inflate(R.layout.apresentacao_view, container, false); 

     TextView txtView = (TextView)view.findViewById(R.id.tvApresentacao); 
     txtView.setText(Html.fromHtml(getString(R.string.apresentacao))); 

     return view; 
    } 

    private void alteraTextView(String texto){ 
     TextView txtView = (TextView)getView().findViewById(R.id.tvApresentacao); 
     txtView.setText(Html.fromHtml(getString(R.string.apresentacao))); 
    } 

} 

ответ

1

Необходимо действительно создать функцию FragmentActivity? Как открыть фрагмент, нажав кнопку?

Вы используете ActionBarActivity, который наследуется FragmentActivity, поэтому у вас уже есть FragmentManager. Если вы хотите, чтобы открыть фрагмент, нажав кнопку затем добавить аналогичный код в OnClickListener код баттона: getSupportFragmentManager().beginTransaction().replace(R.id.view_to_which_attac‌​h_fragment, yourNewFragment).commit()

Как я могу остановить «назад нажата кнопка» событие фрагмента без FragmentActivity?

Если я правильно понимаю, что вы хотите, это «переопределить» функциональность кнопки «Назад». В основном вам нужно понять, что это не Фрагмент, который реагирует на нажатие кнопки нажатой кнопки. Это всегда действие, которое реагирует, и потому что Activity содержит фрагмент, он может распространять на них кнопку нажатой кнопки назад. Внесите @Override public void onBackPressed() { \\do something here } в действие. Не забудьте сделать это в ActionBarActivity. Fragment не имеет такого метода. Если вы хотите каким-то образом отреагировать на ваш Fragment на нажатие кнопки «Назад», то теперь от onBackPressed() в вашем ActionBarActivity получите Fragment от getSupportFragmentManager().findFragmentById() или getSupportFragmentManager().findFragmentByTag() и позвоните в некоторые из общедоступных методов.

Если мне нужно создать FragmentActivity, как я могу добавить DrawerLayout?

Просто установите макет с DrawerLayout внутри как ваш ActionBarActivity макет. Затем внутри этого DrawerLayout держите FrameLayout, в который вы добавите свои фрагменты через FragmentManager.

0

FragmentActivity действительно должны быть созданы?

Да, его необходимо создать. Вы не можете создавать фрагменты без FragmentActivity. FragmentActivity содержит FragmentManager, который управляет фрагментами. ActionBarActivity наследует от FragmentActivity.

Как я могу остановить фрагмент без FragmentActivity?

Вы не можете. Управляйте своими фрагментами через FragmentManager.

Если мне нужно создать FragmentActivity, как я могу добавить DrawerLayout?

Просто установите в качестве макета макета FragmentActivity с DrawerLayout внутри. Затем внутри этого DrawerLayout сохранится FrameLayout, к которому вы добавите свои фрагменты через FragmentManager.

+0

, но ActionBarActivity наследует от FragmentActivity: «Расширять классы активности от ActionBarCompat: ActionBarCompat содержит один класс Activity, который должен расширять все ваши классы активности: ActionBarActivity. Этот класс сам распространяется из FragmentActivity, поэтому вы можете продолжать использовать фрагменты в своем приложении. Существует не класс ActionBarCompat Fragment, который вам нужно расширить, поэтому вы должны продолжить использовать android.support.v4.Fragment как базовый класс для ваших фрагментов. – FernandoPaiva

+0

Да, я написал об этом в ответ ... –

+0

очень приятно , поэтому у меня есть FragmentActivity :). Но если я хочу открыть Фрагмент с помощью кнопки в моем макете? – FernandoPaiva

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