从Fragment调用Activity

时间:2017-01-01 13:36:01

标签: java android android-studio android-fragments

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

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

P.S。 1.应用程序打开默认活动 2.用户通过传递意图数据来调用新活动 3.新活动调用片段

第一项(主要)活动:

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

5 个答案:

答案 0 :(得分:1)

您只能在拨打getActivity()onAttach()之间访问onDetach()的活动。

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

答案 1 :(得分:0)

你是否扩展了Fragment OR FragmetnActivity?

如果你扩展FragmetnActivity(我想),那就不要使用getActivity()

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

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

您刚刚创建了未将其附加到活动的新片段? 使用FragmentManager。

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

答案 2 :(得分:0)

您应该将Fragment_Questions添加到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);

答案 3 :(得分:0)

您正在获取Null Pointer Exception,因为您的片段未附加到Activity。您只是实例化片段,然后调用其openProfile(View v)方法,这是处理事件的错误方法。如果你已经附加了片段,那么使用

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

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

答案 4 :(得分:0)

由于我已经完成了用户干扰的步骤,您必须将片段中的getIntent()替换为启动它的意图intent_settings我认为

同时制作该意图static以便分享

并且如果为了没有null异常而使if语句

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