英文:
Viewpager2 and Fragments
问题
ViewPager2不支持直接的子视图。
我正在尝试使用以下代码在片段之间进行过渡,但在使用ViewPager2时出现了上述错误。
在片段1中调用以过渡到片段2:
getFragmentManager().beginTransaction().replace(R.id.viewPager2, new q2_fragment()).addToBackStack(null).commit();
主布局中的ViewPager2 XML:
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="10"
android:orientation="horizontal"
android:scaleType="fitXY" />
在主Activity中的实例化:
final ViewPager2 viewPager2 = findViewById(R.id.viewPager2);
viewPager2.setAdapter(new QuestionsActivity.ScreenSlidePagerAdapter(this));
viewPager2.setUserInputEnabled(false);
如何避免在ViewPager2中出现这个错误?
英文:
ViewPager2 does not support direct child views
I'm trying to transition between fragments using the following code but I get the above error when using viewpager2.
Call in fragment 1 to transition to fragment 2:
getFragmentManager().beginTransaction().replace(R.id.viewPager2, new q2_fragment()).addToBackStack(null).commit();
Viewpager2 XML in Main Layout:
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="10"
android:orientation="horizontal"
android:scaleType="fitXY" />
Instantiation in Main:
final ViewPager2 viewPager2 = findViewById(R.id.viewPager2);
viewPager2.setAdapter(new QuestionsActivity.ScreenSlidePagerAdapter(this));
viewPager2.setUserInputEnabled(false);
How do I avoid this error with viewpager2?
答案1
得分: 5
我在将TabLayout
放在ViewPager
的闭合标签之前时遇到了相同的错误。
即:
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.viewpager2.widget.ViewPager2>
这是不允许的!
只需移除结尾标签并将TabLayout
分离,就可以正常工作。
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
英文:
I got the same error when I put the TabLayout
before ViewPager
's closing tag
That is:
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.viewpager2.widget.ViewPager2>
Which is not Allowed!
Just Removing the ending tag and separating TabLayout
will work
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
答案2
得分: 1
以下是翻译好的部分:
"Would be happy to help, please elaborate on your requirement. What exactly you want to do."(我很乐意帮助,但请详细说明您的需求。您究竟想要做什么。)
"If you want to go to fragment 2
from fragment 1
, at a particular point then you should use interface
between fragment and activity, to tell the activity to move the viewpager
to the item which has fragment 2
."(如果您想从 fragment 1
转到 fragment 2
,在特定点上,那么您应该在 fragment 和 activity 之间使用 interface
,以通知 activity 将 viewpager
移动到包含 fragment 2
的项目。)
"Interface Pattern for Fragment to Activity"(Fragment 到 Activity 的接口模式)
public interface FragmentCallback{
public void goTo(int pos);
}
Activity(活动)
public class MyActivity extends AppCompatActivity implements MyStringListener{
@Override
public void goTo(int pos){
yourviewpagerAdapter.setCurrentItem(pos);
}
}
Fragment1
public class Fragment1 {
private FragmentCallback callBack;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
callBack = (FragmentCallback) context;
} catch (ClassCastException castException) {
/** The activity does not implement the listener. */
}
}
public void someEvent() {
if(callBack!=null) {
callBack.goTo(1);
}
}
}
英文:
Would be happy to help, please elaborate on your requirement. What exactly you want to do.
If you want to go to fragment 2
from fragment 1
, at a particular point then you should use interface
between fragment and activity, to tell the activity to move the viewpager
to the item which has fragment 2
.
Interface Pattern for Fragment to Activity
Interface
public interface FragmentCallback{
public void goTo(int pos);
}
Activity
public class MyActivity extends AppCompatActivity implements MyStringListener{
@Override
public void goTo(int pos){
yourviewpagerAdapter.setCurrentItem(pos);
}
}
public class Fragment1 {
private FragmentCallback callBack;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
callBack = (FragmentCallback) context;
} catch (ClassCastException castException) {
/** The activity does not implement the listener. */
}
}
public void someEvent() {
if(callBack!=null) {
callBack.goTo(1);
}
}
}
答案3
得分: 0
正如该语句所说:
ViewPager2不支持直接添加子视图
因此,不要试图将片段直接添加到viewPager2中
即以下代码行在viewPager2中不起作用。
<!-- language: lang-js -->
getFragmentManager().beginTransaction().replace(R.id.viewPager2, new q2_fragment()).addToBackStack(null).commit();
<!-- end snippet -->
如果您尝试使用fragmentManager
将片段直接添加到viewPager2中,将会产生异常。
因此,只需删除上述代码行即可摆脱此异常。
英文:
As the statement says
ViewPager2 does not support direct child views
So never try to add the fragment to viewPager2 directly
i.e the following lines of code will not work with viewPager2.
<!-- language: lang-js -->
getFragmentManager().beginTransaction().replace(R.id.viewPager2, new q2_fragment()).addToBackStack(null).commit();
<!-- end snippet -->
The exception is produced if you try to add fragment directly to viewPager2 with the help of fragmentManager
.
So simply remove the above lines of code to get rid of this exception.
答案4
得分: 0
让我们假设从 Fragment_1
到 Fragment_2
:
在 Fragment_1
中的按钮点击事件内部
Bundle result = new Bundle(); result.putString("bundleKey", "result"); getParentFragmentManager().setFragmentResult("requestKey", result);
在 Fragment_2
的 onCreate(Bundle savedInstanceState)
方法内部
getParentFragmentManager().setFragmentResultListener("requestKey", this, new FragmentResultListener() {
@Override public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle bundle)
{
String result = bundle.getString("bundleKey"); System.out.println("----------------------------"+result);
}
});
https://developer.android.com/guide/fragments/communicate#pass-between-fragments
英文:
Lets Say From Fragment_1
to Fragment_2
:
In side the button click in Fragment_1
Bundle result = new Bundle(); result.putString("bundleKey", "result"); getParentFragmentManager().setFragmentResult("requestKey", result);
In side the Fragment_2
onCreate(Bundle savedInstanceState)
method
getParentFragmentManager().setFragmentResultListener("requestKey", this, new FragmentResultListener() {
@Override public void onFragmentResult(@NonNull String requestKey, @NonNull Bundle bundle)
{
supported String result = bundle.getString("bundleKey"); System.out.println("----------------------------"+result);
}
});
https://developer.android.com/guide/fragments/communicate#pass-between-fragments
答案5
得分: -1
使用 mPager.setNestedScrollingEnabled(true);
。
英文:
Use mPager.setNestedScrollingEnabled(true);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论