2016-01-27 5 views
0

У меня есть активность с ящиком навигации и пустой макет. При создании действия я показываю фрагмент (в пустом макете активности). Идентификатор фрагмента - dateVehicleMainContent. При выборе элементов навигации отображаются другие фрагменты. При нажатии назад возвращается к предыдущему фрагменту.findFragmentById возвращает null

Я хочу отобразить диалог выхода, когда текущий фрагмент является первым фрагментом, который я отобразил (dateVehicleMainContent). Он отображается, когда нажимается назад для каждого фрагмента. Я не хочу, чтобы он отображался в других фрагментах, которые занимают пустой макет действия. Поэтому я использую findFragmentById. MAybe это не работает, потому что я отображаю фрагмент в пустой макет Activity.

DateTimePicker - это класс фрагментов.

Это Activity с пустым макетом и с onBackPressed(), чтобы проверить, если текущий фрагмент фрагмент с идентификатором dateVehicleMainContent

@Override 
public void onBackPressed() { 

    Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.dateVehicleMainContent); 

    if (currentFragment instanceof DateTimePicker) { 


     AlertDialog.Builder alertDialog = new AlertDialog.Builder(DateVehiclePicker.this); 

     alertDialog.setTitle("Logout"); 

     // Setting Dialog Message 
     alertDialog.setMessage("Do you want to Logout?"); 
     alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       sessionManager.logoutUser(); 
      } 
     }); 

     alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       intent.putExtra("EXIT", true); 
       startActivity(intent); 
       dialog.cancel(); 
      } 
     });alertDialog.show(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

макет своей деятельности по:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/drawerLayout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.prematixsofs.taxiapp.DateVehiclePicker"> 
<!-- The main content view --> 
<RelativeLayout 
    android:id="@+id/mainContent" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 


<!-- The navigation drawer --> 
<RelativeLayout 
    android:id="@+id/drawerPane" 
    android:layout_width="280dp" 
    android:layout_height="match_parent" 

    android:layout_gravity="start"> 

    <!-- Profile Box --> 

    <RelativeLayout 
     android:id="@+id/profileBox" 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:background="#ff02c7c4" 
     android:padding="8dp"> 

     <ImageView 
      android:id="@+id/avatar" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:layout_marginTop="15dp" 
      android:src="@drawable/user" /> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="42dp" 
      android:layout_centerVertical="true" 
      android:layout_marginLeft="15dp" 
      android:layout_toRightOf="@+id/avatar" 
      android:orientation="vertical"> 

      <TextView 
       android:id="@+id/userName" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:clickable="true" 
       android:textColor="#fff" 
       android:textSize="16sp" 
       android:textStyle="bold" /> 

      <TextView 
       android:id="@+id/viewProfile" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="bottom" 
       android:layout_marginTop="4dp" 
       android:text="View Profile" 
       android:textColor="#fff" 
       android:textSize="12sp" /> 
     </LinearLayout> 
    </RelativeLayout> 

    <!-- List of Actions (pages) --> 
    <ListView 
     android:id="@+id/navList" 
     android:layout_width="280dp" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/profileBox" 
     android:background="#ffffffff" 
     android:choiceMode="singleChoice" /> 

</RelativeLayout> 

Этих является частью макета фрагмента. Когда этот фрагмент отображается, я хочу показать диалоговое окно предупреждения для выхода:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/dateVehicleMainContent" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.looper.loop.DateTimePicker"> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

    android:id="@+id/dateVehicleLinearLayoutMainContent" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
+0

Попробуйте использовать 'findFragmentByTag()' вместо этого и убедиться, что все фрагменты имеют метки:) Кроме того, уведомите родительскую активность с обратным вызовом из 'YourFragment.onDetach()', чтобы отобразить диалог. – Shark

+0

@Shark Привет .. Я новичок в android. Можете ли вы предоставить мне ссылку с примером или ответом на примере? – Abhi

+0

Я наклеил некоторый код, который у меня был рядом, чтобы проиллюстрировать подход. – Shark

ответ

0

ОК, попробуйте что-нибудь подобное. Это не очень полный пример, и он не может быть построен, потому что он использует некоторые из моих собственных кодов (классов), но он очень хорошо демонстрирует подход.

String title = getIntent().getStringExtra(EXTRA_TITLE); 
tag = getIntent().getStringExtra(EXTRA_FRAGMENT_TAG); 
FilterFragment currentFragment = null; 

     if (tag.equals(FragmentMyWishlist.TAG)) { 
      currentFragment = (FilterFragment) getSupportFragmentManager().findFragmentByTag(FragmentMyWishlist.TAG); 
     } else if (tag.equals(FragmentMyLibrary.TAG)) { 
      currentFragment = (FilterFragment) getSupportFragmentManager().findFragmentByTag(FragmentMyLibrary.TAG); 
     } 

Вы можете не использовать getSupportFragmentManager() и может получить работу с getFragmentManager(), но идея та же. Я должен был использовать SupportFragmentManager, потому что я использую import android.support.v4.app.Fragment;

EDIT:

FragmentMyWishlist имеет public static String TAG = "FragmentMyWishlist"; FragmentMyLibrary имеет public static String TAG = "FragmentMyLibrary";

+0

Извините, если это звучит глупо. Что такое 'FragmentMyWishlist.TAG'. Это тег, который вы устанавливаете при замене фрагмента следующим образом: 'fragmentTransaction.addToBackStack (null) .replace (R.id.mainContent, новый DateTimePicker()," tags "). Commit();'? Я попытался проверить строку, содержащую «теги», как вы это делали с «MyFragment.TAG», но TAG не может решить. Правильно ли я это делаю? – Abhi

+0

нет ... Я вижу, что редактирование в порядке. – Shark

+0

где вы устанавливаете StringExtra? какова ценность 'tag'. – Abhi

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

  • Нет связанных вопросов^_^