我在片段类中调用活动时遇到问题。更多:
适配器布局的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;
}
}
答案 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.....}