2

各ページに異なるフラグメントを持つViewPagerを実装しました。ポートレートモードでは、ViewPagerは単一のフラグメントを表示します。 Landscapeモードでは、ViewPagerは2つのフラグメントを並べて表示します。私はこれを、ViewPagerAdapterのgetPageWidth()オーバーライドを使って実現しました。このように:2つのViewPagerのフラグメントが並んでいませんEditText

@Override 
public float getPageWidth(int position) { 
    DisplayMetrics metrics = getResources().getDisplayMetrics(); 
    if ((metrics.widthPixels/metrics.density) > 900) { 
     return (0.5f); 
    } 
    return super.getPageWidth(position); 
} 

私はEditTextフィールドを持っています。

風景モードで、2つのフラグメントが並んでいる場合、クリックして左側のフラグメントのEditTextにフォーカスを当てることができます。右の断片上のEditTextをクリックしようとすると、私はできませんし、私のログに次の警告を得る:

W/IInputConnectionWrapper:getTextBeforeCursor

非アクティブInputConnection上MainActivity.java

public class MainActivity extends AppCompatActivity /*implements PageLoader*/ { 
    MyPagerAdapter adapter; 
    DirectionalViewPager pager; 

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

     // Get the ViewPager and set it's PagerAdapter so that it can display items 
     pager = (DirectionalViewPager) findViewById(R.id.vpPager); 
     adapter = new MyPagerAdapter(getSupportFragmentManager()); 
     pager.setOffscreenPageLimit(8); 
     pager.setAdapter(adapter); 
    } 

    public class MyPagerAdapter extends SmartFragmentStatePagerAdapter { 
     private static final int NUM_ITEMS = 4; 

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

     // Returns total number of pages 
     @Override 
     public int getCount() { 
      return NUM_ITEMS; 
     } 

     // Returns the fragment to display for that page 
     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: // Fragment # 0 - This will show Frag1 
        return Frag1.newInstance(position, Frag1.class.getSimpleName()); 
       case 1: // Fragment # 0 - This will show Frag1 different title 
        return Frag1.newInstance(position, Frag1.class.getSimpleName()); 
       case 2: // Fragment # 1 - This will show Frag2 
        return Frag2.newInstance(position, Frag2.class.getSimpleName()); 
       default: 
        return Frag3.newInstance(position, Frag3.class.getSimpleName()); 
      } 
     } 

     // Returns the page title for the top indicator 
     @Override 
     public CharSequence getPageTitle(int position) { 
      return "Page " + position; 

     } 

     @Override 
     public float getPageWidth(int position) { 
      DisplayMetrics metrics = getResources().getDisplayMetrics(); 
      if ((metrics.widthPixels/metrics.density) > 900) { 
       return (0.5f); 
      } 
      return super.getPageWidth(position); 
     } 
    } 
} 

frag1.java,frag2.javaおよびFrag3.java

public class Frag1 extends Fragment { 
    // newInstance constructor for creating fragment with arguments 
    public static Frag1 newInstance(int page, String title) { 
     Frag1 fragmentFirst = new Frag1(); 
     Bundle args = new Bundle(); 
     args.putInt("someInt", page); 
     args.putString("someTitle", title); 
     fragmentFirst.setArguments(args); 
     return fragmentFirst; 
    } 
    // Inflate the view for the fragment based on layout XML 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.frag1, container, false); 
     return view; 
    } 
} 

frag1.xmlfrag2.xml、およびfrag3.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="#cc2"> 

    <TextView 
     android:id="@+id/txt_frag1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="txt_frag1" 
     /> 
    <Button 
     android:id="@+id/btn_frag1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:text="btn_frag1" 
     android:textSize="26dp" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/et_frag1" 
     android:ems="10" 
     android:text="ET_FRAG1"/> 

</LinearLayout> 

なぜそれが起こっていると私はそれを回避する方法を得るのですか?

+0

キーボードを手動で非表示にし、あなたはEditextを切り替えます。 – Herry

+0

いいえ、それは動作しません。キーボードのOnFocusChangeを隠して、ユーザーが編集テキストをクリックしたときに再び表示しようとしました。しかし、右のEditTextはフォーカスを拒否します。私はさらに、OnClickイベントでv.requestFocus()を試みました。 – chaser

+0

getSupportFragmentManager()の代わりにgetChildFragmentManager()を使用してみてください –

答えて

2

無数の時間をインターネットで掃除した結果、この問題は本来ViewPagerの問題であると説明しているSO answerです。したがって、それを真に修正する唯一の方法は、ViewPagerソース自体を変更することです。

void populate(int newCurrentItem) { 

    // ... CODES OMITTED 

    if (hasFocus()) { 
     View currentFocused = findFocus(); 
     ItemInfo ii = currentFocused != null ? infoForAnyChild(currentFocused) : null; 
     if (ii == null || !infoIsOnScreen(ii)) { 
      for (int i = 0; i < getChildCount(); i++) { 
       View child = getChildAt(i); 
       ii = infoForChild(child); 
       if (ii != null && infoIsOnScreen(ii)) { 
        if (child.requestFocus(FOCUS_FORWARD)) { 
         break; 
        } 
       } 
      } 
     } 
    } 
} 

public boolean infoIsOnScreen(ItemInfo info) { 
    float curItemOffset = mCurItem * info.widthFactor; // find the offset value for curr item 
    float offsetUpperBound = curItemOffset + 1;   // +1 to get the upper bound offset value 
    if ((info.offset >= curItemOffset) && (info.offset < offsetUpperBound)) 
     return true; // curr item offset value is within bound, hence it is on the screen 
    return false; 
} 

してくださいアップ投票このまたは他のあなたはこれが役立つならば、原因この問題の不人気にそれを掘るために本当にハードだったので、SO、答えます。なぜViewPagerがそれ自体が人気があると考えているのか理解できないのですが、確かに人々はEditTextを以前に使用していました(たぶん同じ画面の複数のページで多く使用しないでしょう)

関連する問題