java - 从 Fragment 调用 Activity

标签 java android android-studio android-fragments

我在从 fragment 类调用 Activity 时遇到问题。更多:

适配器布局的 XML:

<TextView
     style="@style/LiHeadLogin"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:foreground="?android:attr/selectableItemBackground"
     android:clickable="true"
     android:onClick="openProfile"
     android:id="@+id/genFrom" />

来自调用 fragment 的主要 Activity 的代码:

public void openProfile(View v) {
     Fragment_Questions frau = new Fragment_Questions();
     frau.openProfile(v);
}

来自 fragment 类的代码:

public void openProfile(View v) {

    View row = (View) v.getParent();

    TextView child2 = (TextView) row.findViewById(R.id.genFromlogin);
    String child3 = child2.getText().toString();

    Intent ini = getActivity().getIntent();
    String c_username = ini.getStringExtra(MainActivity.KEY_USERNAME);
    String c_password = ini.getStringExtra(MainActivity.KEY_PASSWORD);
    Intent ini2 = new Intent(context, User.class);
    ini2.putExtra(MainActivity.KEY_USERNAME, c_username);
    ini2.putExtra(MainActivity.KEY_PASSWORD, c_password);
    ini2.putExtra(MainActivity.KEY_USER, child3);
    getActivity().startActivity(ini2);

}

错误:

java.lang.IllegalStateException: Could not execute method for android:onClick
...
...
...
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Intent android.support.v4.app.FragmentActivity.getIntent()' on a null object reference

附言 1. App打开默认activity 2. 用户通过传递 Intent 数据调用新 Activity 3.新的 Activity 调用 fragment

第一个(主要) Activity :

Intent intent_settings = getIntent();
            String c_username = intent_settings.getStringExtra(MainActivity.KEY_USERNAME);
            String c_password = intent_settings.getStringExtra(MainActivity.KEY_PASSWORD);
            Intent intent_settings_1 = new Intent(this, NewFeed.class);
            intent_settings_1.putExtra(MainActivity.KEY_USERNAME, c_username);
            intent_settings_1.putExtra(MainActivity.KEY_PASSWORD, c_password);
            intent_settings_1.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            startActivity(intent_settings_1);

好的,你应该知道所有的 fragment 都是由带有选项卡布局的 viewpager 调用的。

@Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                Fragment_Home tab1 = new Fragment_Home();
                return tab1;
            case 1:
                Fragment_Questions tab2 = new Fragment_Questions();
                return tab2;
            default:
                return null;
        }
    }

最佳答案

您只能在调用 onAttach()onDetach() 之间使用 getActivity() 访问 Activity 。

Fragment_Questions 本身似乎只是为了开始一个新 Activity ,所以您可以将所有逻辑移至 Activity 的点击监听器中,根本不使用该 fragment 。

如果有更多关于 fragment 的内容,并且您实际上计划在将来某个时候将其添加到 Activity 中,那么将此逻辑与 fragment 分开似乎仍然更好。您只使用 getActivity() 和神奇的 context 。您可以只将其设为静态并将 Activity 作为参数提供。

public static void openProfile(Activity activity, View v) {
    View row = (View) v.getParent();

    TextView child2 = (TextView) row.findViewById(R.id.genFromlogin);
    String child3 = child2.getText().toString();

    Intent ini = activity.getIntent();
    String c_username = ini.getStringExtra(MainActivity.KEY_USERNAME);
    String c_password = ini.getStringExtra(MainActivity.KEY_PASSWORD);
    Intent ini2 = new Intent(activity, User.class);
    ini2.putExtra(MainActivity.KEY_USERNAME, c_username);
    ini2.putExtra(MainActivity.KEY_PASSWORD, c_password);
    ini2.putExtra(MainActivity.KEY_USER, child3);
    activity.startActivity(ini2);
}

关于java - 从 Fragment 调用 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41415856/

相关文章:

java - Android Studio 找不到 AAR 包

java - 使用快速排序对大型列表进行排序时总是会发生堆栈溢出

android - 访问 native 音频记录

android - 选择 TextView 文本的一部分

android - 更新 ListView 中的进度条以进行多文件下载

android - 构建 apk 失败,错误为 : package android. arch.core.util 不存在

java - 创建 YouTubePlayerView 时出错

java - 调用init方法失败;嵌套异常是 org.hibernate.AnnotationException : No identifier specified for entity

java - 如何合并、创建标签并按升序排列更多 RSS 提要链接的提要,如 Yahoo Pipes 上的提要?

java - 如何禁用 '' 是否要在 selenium webdriver 中保存此站点的 chrome 弹出窗口的密码