Android ViewPager中的片段没有与其关联的活动
我有一个用例,其中我使用带有TabLayout的ViewPager。我已经使用了Android教程 我的布局Android ViewPager中的片段没有与其关联的活动,android,android-fragments,android-intent,android-viewpager,Android,Android Fragments,Android Intent,Android Viewpager,我有一个用例,其中我使用带有TabLayout的ViewPager。我已经使用了Android教程 我的布局 <?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_p
<?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">
<androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/notification_view_pager">
<com.google.android.material.tabs.TabLayout
android:id="@+id/notification_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.viewpager.widget.ViewPager>
</LinearLayout>
片段1和片段2的设置类似。所以我以FragmentOne为例
class FragmentOne extends Fragment {
. . . . Define all UI elements . . . .
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
final View view = inflater.inflate(R.layout.fragment_layout, container, false);
... Initialize all the layout UI elements . . .
return view;
}
}
更新
我在片段布局中定义了一个按钮。该按钮在onCreateView方法中初始化。单击按钮后,我想启动一个新活动
发行
我必须从片段内部加载另一个活动。我就是这样做的
Intent intent = new Intent(getActivity(), MyNewActivity.class);
getActivity().startActivity(intent);
但是,应用程序终止,因为getActivity始终返回null。如果我在视图寻呼机中没有片段,那么函数不会返回null
期望的行为
我想从一个片段中加载新的应用程序活动,该片段已加载到视图寻呼机中。如何实现这一点?尝试类似的方法,假设您通过单击按钮启动新的意图 在你的fragment类中
public class MyFragment extends Fragment implements View.OnclickListener {
private Activity activity;
@Override
public void onAttach(Context context) {
activity = (Activity) context;
}
@Override
public void onDetach(){
activity = null;
}
@Override
public void onClick(View v) {
startIntent();
}
private void startIntent(){
if (activity == null) return;
Intent intent = new Intent(activity, MyNewActivity.class);
activity.startActivity(intent);
}
}
如果这不起作用,即activity为null,那么您可能在片段的错误生命周期阶段启动了intent,此时片段未附加到活动,也未通过按钮的onclicklistener。我会在您的活动中讨论该方法,并从片段中调用它。我在你们班的最后添加了一个方法 活动:
public class MyActivity extends AppCompatActivity
{
int currentFocussedTab = -1;
private TabLayout notificationsTabLayout;
private ViewPager notificationsViewPager;
private FragmentStatePagerAdapter notificationsStatePagerAdapter;
private Fragment fragmentOne;
private Fragment fragmentTwo;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity);
// Setting up tabbed layouts.
notificationsTabLayout = findViewById(R.id.notification_tabs);
notificationsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab)
{
int position = tab.getPosition();
currentFocussedTab = position;
// Custom function to log click.
if (position == 0) {
fragmentOne.logClick();
} else {
fragmentTwo.logClick();
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab)
{
int position = tab.getPosition();
if (position == 0) {
fragmentOne.logUnselect();
} else
fragmentTwo.logUnselect();
}
}
@Override
public void onTabReselected(TabLayout.Tab tab) {}
});
// Set up view pager.
notificationsViewPager = findViewById(R.id.notification_view_pager);
notificationsViewPager.setCurrentItem(0);
notificationsTabLayout.setupWithViewPager(notificationsViewPager);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentOne = new FragmentOne();
fragmentTwo = new FragmentTwo();
notificationsStatePagerAdapter = new FragmentStatePagerAdapter(fragmentManager,
FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
@NonNull
@Override
public Fragment getItem(int position)
{
return position == 0 ? fragmentOne : fragmentTwo;
}
@Override
public int getCount()
{
// Two fixed tabs.
return 2;
}
@Nullable
@Override
public CharSequence getPageTitle(int position)
{
return position == 0 ? getText(R.string.act_now_tab) : getText(R.string.others_tab);
}
};
notificationsViewPager.setAdapter(notificationsStatePagerAdapter);
}
public void startNewActivity() {
Intent intent = new Intent(this, MyNewActivity.class);
startActivity(intent);
}
}
内部碎片:
将其放入片段的click函数中
您是否尝试过将活动上下文从活动传递到片段类?将其保存在全局变量中,然后您可以尝试使用它来启动另一个活动您应该将活动变量作为成员存储在片段的onAttach中的片段中,并在以后使用它来启动新的活动。Nanatach中的上下文活动保证为@nonNull。您将启动新活动的代码放在哪里?@MohammedAlaa我将它放在片段中。在片段布局中,有一个按钮被定义为UI元素之一。我有一个创建意图的onclick侦听器回调。在这里选择2和3应该可以,但要小心将对活动的引用保留在片段中,这不是一种好的形式,因为可能会导致内存泄漏。@CoryRoy是的,一般来说。但你能详细说明一下这个具体案例吗?我相信从OnTach传递的引用是可以的,这是从OnTach移除的。
public class MyActivity extends AppCompatActivity
{
int currentFocussedTab = -1;
private TabLayout notificationsTabLayout;
private ViewPager notificationsViewPager;
private FragmentStatePagerAdapter notificationsStatePagerAdapter;
private Fragment fragmentOne;
private Fragment fragmentTwo;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity);
// Setting up tabbed layouts.
notificationsTabLayout = findViewById(R.id.notification_tabs);
notificationsTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab)
{
int position = tab.getPosition();
currentFocussedTab = position;
// Custom function to log click.
if (position == 0) {
fragmentOne.logClick();
} else {
fragmentTwo.logClick();
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab)
{
int position = tab.getPosition();
if (position == 0) {
fragmentOne.logUnselect();
} else
fragmentTwo.logUnselect();
}
}
@Override
public void onTabReselected(TabLayout.Tab tab) {}
});
// Set up view pager.
notificationsViewPager = findViewById(R.id.notification_view_pager);
notificationsViewPager.setCurrentItem(0);
notificationsTabLayout.setupWithViewPager(notificationsViewPager);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentOne = new FragmentOne();
fragmentTwo = new FragmentTwo();
notificationsStatePagerAdapter = new FragmentStatePagerAdapter(fragmentManager,
FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
@NonNull
@Override
public Fragment getItem(int position)
{
return position == 0 ? fragmentOne : fragmentTwo;
}
@Override
public int getCount()
{
// Two fixed tabs.
return 2;
}
@Nullable
@Override
public CharSequence getPageTitle(int position)
{
return position == 0 ? getText(R.string.act_now_tab) : getText(R.string.others_tab);
}
};
notificationsViewPager.setAdapter(notificationsStatePagerAdapter);
}
public void startNewActivity() {
Intent intent = new Intent(this, MyNewActivity.class);
startActivity(intent);
}
}
...
MyActivity myActivity = getActivity()
if (myActivity != null)
myActivity.startNewActivity()
...