【问题标题】:Calling Activity from Fragment从 Fragment 调用 Activity
【发布时间】:2017-05-15 21:54:33
【问题描述】:

我在从片段类调用活动时遇到问题。更多:

适配器布局的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" />

主要活动中调用片段的代码:

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

片段类的代码:

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. 用户调用一个新的活动并传递意图数据 3. 新的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);

好的,你应该知道所有的片段都是由带有标签布局的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;
        }
    }

【问题讨论】:

  • 你会添加putStringExtra的intent
  • @DasserBasyouni 是的,我已经添加了它

标签: java android android-studio android-fragments


【解决方案1】:

你扩展 Fragment 还是 FragmetnActivity?

如果你扩展 FragmetnActivity(我认为),那么不要使用 getActivity()

还为启动当前活动的意图添加代码

 Fragment_Questions frau = new Fragment_Questions();
     frau.openProfile(v);

您刚刚创建了新片段,但没有将其附加到活动中? 使用 FragmentManager。

如果您尝试在 ViewPager 中使用片段,请使用 THIS 指南

【讨论】:

  • 我只使用片段
  • 上传您开始当前活动的代码
  • 我使用带有标签布局的viewpager来调用fragment
  • 兄弟,我很想帮助你,但你只给了我们一小部分代码,我们需要看看你的布局和整个片段的样子,否则我们只会继续猜测。
  • 我知道那是我告诉你的。您正在制作未附加到活动的新片段,因此 getActivity()= null
【解决方案2】:

据我了解用户干扰的步骤,您必须将片段中的getIntent() 替换为启动它的意图,即intent_settings 我认为

也为了分享它而做出那个意图static

为了不出现空异常而制作 if 语句

if(theIntent.hasPutextra)
{getExtra.....}

【讨论】:

    【解决方案3】:

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

    Fragment_Questions 本身似乎仅用于启动新活动,因此您可以将所有逻辑移至活动的点击侦听器,根本不使用片段。

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

    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);
    }
    

    【讨论】:

    • 能否请您添加一些代码如何实现,我试过了,但不成功。
    • 我成功了!!感谢您的帮助
    【解决方案4】:

    您收到空指针异常,因为您的片段未附加到 Activity。您只是在实例化片段,然后调用它的 openProfile(View v) 方法,这是处理事件的错误方法。如果你已经附加了片段,那么使用

    获取framgent的实例
    questionFragment = (Fragment_Questions) findViewById(fragment_question);
    

    您可以阅读下面有关如何从 Fragments 到活动进行通信的文章 https://developer.android.com/training/basics/fragments/communicating.html

    【讨论】:

    • 我使用带有标签布局的viewpager来调用fragment
    • 函数调用成功,问题出在调用activity的方法内部
    【解决方案5】:

    您应该将 Fragment_Questions 添加到 Activity。

    例如,在Activity布局中:

     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:context=".MainActivity" >
    
         <fragment
             android:id="@+id/fragment_question"
             android:name="com.example.view.Fragment_Questions"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content" />
     </LinearLayout>
    

    在 Acitivity.java 中:

    questionFragment = (Fragment_Questions) findViewById(fragment_question);
    

    然后,您可以像这样使用 OnClick 事件:

    questionFragment.openProfile(v);
    

    【讨论】:

    • 我使用带有标签布局的viewpager来调用fragment
    • 函数调用成功,问题出在调用activity的方法内部
    • 你在Activity中初始化ViewPager了吗?你应该提供更详细的代码。
    • 是的,我已经启动了,我已经在我的问题中添加了更多代码
    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多