2

Мое требование: у меня есть основное действие, и я хочу отображать изображение и текст вместо индикатора выполнения в отдельном фрагменте. У меня есть отдельный фрагмент, и я хочу отобразить фрагмент, когда пользователь нажимает кнопку в MainActivity.Фрагмент скрыть не работает в Android

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

Я в activity_main XML, как показано ниже

<RelativeLayout 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:background="@drawable/background" > 

    <ScrollView 
     android:id="@+id/scrollView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_marginTop="10dp" 
      android:orientation="vertical" > 

      <TableLayout 
       android:id="@+id/tableLayout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:stretchColumns="*" > 

       <TableRow 
        android:id="@+id/tableRow1" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="20dip" > 

        <TextView 
         android:id="@+id/text1" 
         style="@style/textForLabel" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_marginLeft="10dip" 
         android:text="@string/text1" /> 

        <Spinner 
         android:id="@+id/spinner1" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_marginRight="20dip" 
         android:layout_weight="1" 
         android:drawSelectorOnTop="true" 
         android:prompt="@string/spinner1" 
         android:spinnerMode="dialog" > 
        </Spinner> 
       </TableRow> 

       <TableRow 
        android:id="@+id/tableRow2" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" > 

        <TextView 
         android:id="@+id/text2" 
         style="@style/textForLabel" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_marginLeft="10dip" 
         android:text="@string/label2" /> 

        <Spinner 
         android:id="@+id/spinner2" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_marginRight="20dip" 
         android:layout_span="6" 
         android:layout_weight="1" 
         android:drawSelectorOnTop="true" 
         android:prompt="@string/spinner2" 
         android:spinnerMode="dropdown" /> 
       </TableRow> 
      </TableLayout> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="10dp" 
       android:gravity="center" 
       android:orientation="horizontal" > 

       <TextView 
        android:id="@+id/text3" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="" 
        android:textColor="@color/red" 
        android:textSize="@dimen/text_medium" 
        android:textStyle="bold" /> 
      </LinearLayout> 
     </LinearLayout> 
    </ScrollView> 

    <fragment 
     android:id="@+id/progress_bar_fragment" 
     android:name="com.test.pushnotificationeclipse.ProgressBarFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</RelativeLayout> 

fragemnt_progress_bar.xml, как показано ниже:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    style="@style/NoActionBar" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/background_all" > 

    <ImageView 
     android:id="@+id/imageView_frag_pgbar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:src="@drawable/ic_launcher" /> 

    <TextView 
     android:id="@+id/text_frag_pgbar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/imageView_frag_pgbar" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="74dp" 
     android:textColor="@color/basic_color" 
     android:textSize="@dimen/text_medium_large" /> 

</RelativeLayout> 

Мой ProgressBarFragment.java как ниже

public class ProgressBarFragment extends Fragment { 

    @InjectView(R.id.text_frag_pgbar) 
    TextView textView; 

    @InjectView(R.id.imageView_frag_pgbar) 
    ImageView imageView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_progress_bar, container, 
       false); 
     ButterKnife.inject(this, view); 

     return view; 
    } 

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

    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
    } 
} 

Мой MainActivity .java выглядит следующим образом: Когда я передаю true tohideAndShowFragment(), фрагмент должен быть скрыт, и когда я передаю fal se должен быть показан фрагмент.

public class MainActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.inject(this); 
     context = getApplicationContext(); 
     hideAndShowFragment(true); 
    } 

    public void hideAndShowFragment(boolean hide) { 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ProgressBarFragment pf = new ProgressBarFragment(); 
     if (hide) { 
      ft.hide(pf).commit(); 
     } else { 
      ft.show(pf).commit(); 
     } 
    } 
} 

ответ

1

Проблема здесь ваш hideAndShowFragment метод. Вы создаете новый экземпляр ProgressBarFragment, но методы скрытия и показа FragmentTransaction работают только с прикрепленным фрагментом.

Вместо этого вы должны получить фрагмент, который вы уже определили в своем XML по идентификатору.

public void hideAndShowFragment(boolean hide) { 
    FragmentManager fm = getFragmentManager(); 
    ProgressBarFragment pf = 
     (ProgressBarFragment) fm.findFragmentById(R.id.progress_bar_fragment); 
    FragmentTransaction ft = fm.beginTransaction(); 
    if (hide) { 
     ft.hide(pf).commit(); 
    } else { 
     ft.show(pf).commit(); 
    } 
} 

Кроме того, эта линия в отношении:

context = getApplicationContext(); 

Ваш Activity также Context объект, так что если вы не нужны приложения определенного контекста для чего-то, вы вообще хотите использовать this, где вам нужно контекст внутри вашей деятельности.

+0

Это прекрасно работало для скрытия фрагмента. Но show (pf) .commit() не работает нормально – Madhu

0
FragmentManager fm = getFragmentManager(); 
    fm.beginTransaction() 
       .setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out) 
       .show(yourfragment) 
       .commit(); 

Ps:-Dont Don't mess with the visibility flags of the container - FragmentTransaction.hide/show does that internally for you. 

Src: - "https://stackoverflow.com/a/16490344/1632286"

+0

К сожалению, этот подход не сработает. – Madhu

0

Возможно, вам лучше получить экземпляр фрагмента в коде и использовать технику из официальных документов, как показано ниже, и here (поиск «newInstance»). Добавьте к вашему фрагменту следующий статический метод.

public static ProgressFragment newInstance() { 
    DetailsFragment f = new DetailsFragment(); 

    // Supply args here if needed. 
    /*Bundle args = new Bundle(); 
    args.putInt("index", index); 
    f.setArguments(args);*/ 

    return f; 
} 

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

FragmentManager fm = getSupportFragmentManager(); 
FragmentTransaction tr = fm.beginTransaction(); 
tr.add(android.R.id.content, ProgressFragment.newInstance(), "ProgressFragmentTag"); 
tr.commit(); 

Вы можете использовать следующий код для удаления фрагмента, если необходимо;

FragmentManager fm = getSupportFragmentManager(); 
ProgressFragment frag = fm.findFragmentByTag("ProgressFragmentTag") 
if (frag!=null) 
{ 
    FragmentTransaction tr = fm.beginTransaction(); 
    tr.remove(frag).commit(); 
} 

Надеюсь, это поможет!

0

Я решил, добавив фрагмент вместо того, что показано ниже:

public void hideAndShowFragment(boolean hide) { 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ProgressBarFragment pf = (ProgressBarFragment) fm.findFragmentById(R.id.progress_bar_fragment); 
     if (hide) { 
      ft.hide(pf).commit(); 
     } else { 
ft.add(android.R.id.content, pf, "ProgressFragmentTag").commit(); 
     } 
    } 
0
  int count =1; 
      if (count == 1) { 


       FragmentManager fm = getFragmentManager(); 
       FragmentTransaction fragmentTransaction = 
       fm.beginTransaction(); 
       fragmentTransaction.replace(R.id.labelframe, new 
       labelfregaments()); 
       fragmentTransaction.commit(); 
       count =0; 
      } 
      else if (count == 0) { 



       FragmentManager fm = getFragmentManager(); 
       labelfregaments fs = (labelfregaments)fm.findFragmentById(R.id.labelframe); 
       FragmentTransaction fragmentTransaction = fm.beginTransaction(); 
       fragmentTransaction.hide(fs); 
       fragmentTransaction.commit(); 


       count=1; 

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