2016-05-11 40 views
0

我嘗試將一個片段導航到另一個片段。在這裏我使用一個按鈕來完成這個過程。當我運行這個時,我在最後得到一個空白屏幕。Android導航一個片段到另一個正在工作,但無法看到其他片段的背景

這些都是我的步驟,

MainActivity.java

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 

public class MainActivity extends FragmentActivity { 

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

     final int page=2; 

     final ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 

     pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager())); 
     pager.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (pager.getCurrentItem()==page) { 
        return true; 
       } 
       return false; 
      } 
     }); 

    } 

    private class MyPagerAdapter extends FragmentPagerAdapter { 

     public MyPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      switch(pos) { 

       case 0: return FirstFragment.newInstance("FirstFragment, Instance 1"); 
       case 1: return SecondFragment.newInstance("SecondFragment, Instance 1"); 
       case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1"); 
       default: return ThirdFragment.newInstance("ThirdFragment, Default"); 
      } 
     } 

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

    } 
} 

我想瀏覽的第三片段到第四之一。

activity_main.xml中

<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/viewPager" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"/> 

third_frag.xml

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

<TextView 
    android:id="@+id/tvFragThird" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:textSize="26dp" 
    android:text="TextView" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:id="@+id/printButton" 
     android:text="Next"/> 

</RelativeLayout> 

ThirdFragment.java

public class ThirdFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.third_frag, container, false); 

     TextView tv = (TextView) v.findViewById(R.id.tvFragThird); 
     tv.setText(getArguments().getString("msg")); 
     Button button=(Button)v.findViewById(R.id.printButton); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       FourthFragment fourthFragment=new FourthFragment(); 
       Bundle bundle=new Bundle(); 
       bundle.putInt(String.valueOf(FirstFragment.newInstance("Terance")),1); 
       fourthFragment.setArguments(bundle); 

       FragmentManager fragmentManager=getFragmentManager(); 

       FragmentTransaction transaction = fragmentManager.beginTransaction(); 
       transaction.replace(R.id.viewPager, fourthFragment); 
       transaction.addToBackStack(null); 
       transaction.commit(); 
      } 
     }); 

     return v; 
    } 

    public static ThirdFragment newInstance(String text) { 

     ThirdFragment f = new ThirdFragment(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 

} 

fourth_frag.xml

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

    <TextView 
     android:id="@+id/tvFragFourth" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:textSize="26dp" 
     android:text="TextView" /> 

</RelativeLayout> 

FourthFragment.java

public class FourthFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fourth_frag, container, false); 

     TextView tv = (TextView) v.findViewById(R.id.tvFragFourth); 
     tv.setText("Fourth Fragment"); 

     return v; 
    } 

    public static FourthFragment newInstance(String text) { 

     text="Terance"; 
     FourthFragment f = new FourthFragment(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 

} 

有四個片段的類和我提到只有被用於此目的兩項。當到達第三個片段時,不能將其向左或向右滑動。然後我用一個按鈕去第四個片段。但它不起作用。

對此有任何意見?

謝謝。

+0

爲什麼不告訴viewpager單獨滾動到第4個片段,您可以使用viewpager加載4個片段。 – danypata

+0

@danypata:它有目的,在這個應用程序它應該停下來檢查一些條件。 – Barrier

+0

嘗試與按鈕上的孩子片段管理器點擊 – Abhishek

回答

2

你正在用R.id.viewPager替換第四個片段,這是錯誤的。

您應該調用ViewPager方法setcurrentItem(id)來更改View分頁器內部的片段。這是導航的理想方式,因爲我們使用View Pager。

在您的活動,使一個方法:

public void setCurrentItem(int which) { 
    if(viewpager != null && which >= 0 && which <= 4) { 
     viewpager.setCurrentItem(which); 
    } 
} 

調用此方法從ThirdFragment.java

button.setOnClickListener(new View.OnClickListener() { 
    if(getActivity() != null) { 
     getActivity().setCurrentItem(3); // fourth fragment index is 3 
    } 
} 
+0

嗨,我的班級找不到正確的活動。 IDE說'不能解決方法.....' – Barrier

+1

這個方法屬於'ViewPager'類...使用'pager.setCurrentItem(3)'' – Kushal

0

更好地重寫Viewpager的onPageSelected()方法以給出正確的頁面位置。

public void onPageSelected(int position) { 
     //set your page here which gives current page position 
    } 
+0

嗨,提供的示例不具啓發性。請提供更具啓發性的示例。 – Barrier

+0

你能否詳細解釋你的問題? –

2

我覺得你有四個片段,但你在MyPagerAdapter確實是

@Override 
    public Fragment getItem(int pos) { 
     switch(pos) { 

      case 0: return FirstFragment.newInstance("FirstFragment, Instance 1"); 
      case 1: return SecondFragment.newInstance("SecondFragment, Instance 1"); 
      case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1"); 
      default: return ThirdFragment.newInstance("ThirdFragment, Default"); 
     } 
    } 

你只加了3片段在開關的情況下,這就是爲什麼你不能從第三個片段到第四導航片段,我認爲你應該做的是

@Override 
    public Fragment getItem(int pos) { 
     switch(pos) { 

      case 0: return FirstFragment.newInstance("FirstFragment, Instance 1"); 
      case 1: return SecondFragment.newInstance("SecondFragment, Instance 1"); 
      case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1"); 
      case 3: return FourthFragment.newInstance("FourthFragment, Instance 1"); 
      default: return ThirdFragment.newInstance("ThirdFragment, Default"); 
     } 
    } 
0
private class MyPagerAdapter extends FragmentPagerAdapter { 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int pos) { 
     switch(pos) { 

      case 0: return FirstFragment.newInstance("FirstFragment, Instance 1"); 
      case 1: return SecondFragment.newInstance("SecondFragment, Instance 1"); 
      case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1"); 
      default: return ThirdFragment.newInstance("ThirdFragment, Default"); 
     } 
    } 

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

} 

在上面的代碼中,在尋呼機適配器,第四適配器還限定情況下,即

case 3: return FourthFragment.newInstance("FourthFragment, Instance 1"); 

而第二個問題是通過點擊按鈕,您不能使用此代碼去FourthFragment ...

Button button=(Button)v.findViewById(R.id.printButton); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      FourthFragment fourthFragment=new FourthFragment(); 
      Bundle bundle=new Bundle(); 
      bundle.putInt(String.valueOf(FirstFragment.newInstance("Terance")),1); 
      fourthFragment.setArguments(bundle); 

      FragmentManager fragmentManager=getFragmentManager(); 

      FragmentTransaction transaction = fragmentManager.beginTransaction(); 
      transaction.replace(R.id.viewPager, fourthFragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
     } 
    }); 

在發生在android.support.v4.view.ViewPager替換片段,

transaction.replace(R.id.viewPager, fourthFragment); 

使用FrameLayout。

transaction.replace(R.id.framelayout, fourthFragment); 
相關問題