Android 意图不从片段开始活动
我对Android中片段的意图有问题。 我有一个活动,它包含一个片段,而片段又包含一个ListView。 我已经向ListView注册了一个ListView侦听器,当我在活动中正确使用ListView时,这个功能运行良好。然而,我需要用碎片把它包起来 因此,我不再调用Android 意图不从片段开始活动,android,listview,android-fragments,onclicklistener,Android,Listview,Android Fragments,Onclicklistener,我对Android中片段的意图有问题。 我有一个活动,它包含一个片段,而片段又包含一个ListView。 我已经向ListView注册了一个ListView侦听器,当我在活动中正确使用ListView时,这个功能运行良好。然而,我需要用碎片把它包起来 因此,我不再调用getContext()而是调用getActivity(),这是到处都推荐的。这实际上返回了正确的活动。 在打印我的日志时,单击也被注册。但意图从未开始。什么也没发生。 谁能告诉我我错过了什么吗 这是我的密码: _dealList.
getContext()
而是调用getActivity()
,这是到处都推荐的。这实际上返回了正确的活动。
在打印我的日志时,单击也被注册。但意图从未开始。什么也没发生。
谁能告诉我我错过了什么吗
这是我的密码:
_dealList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
Intent in = new Intent(getActivity(), DealView.class);
in.putExtra("deal", position);
in.putExtra("city", _citySearchBar.getText());
startActivity(in);
Log.d("BASE_FRAGMENT", "Activity should have been started here");
}
});
}
以下是LogCat输出:
03/01 09:42:23: Launching app
W/System: ClassLoader referenced unknown path: /data/data/de.coding.mb.konstisapp/lib
Hot swapped changes, activity restarted
D/BASE_FRAGMENT: Activity should have been started here
D/BASE_FRAGMENT: Activity should have been started here
以下是我的AndroidManifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.coding.mb.konstisapp">
<uses-feature
android:name="android.hardware.camera"
android:required="false"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".activities.GreatingsActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".activities.DealSelectionActivity"
android:label="@string/title_activity_deal_selection"
android:parentActivityName=".activities.GreatingsActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="de.coding.mb.konstisapp.activities.GreatingsActivity"/>
</activity>
<activity
android:name=".activities.DealCreationActivity"
android:label="@string/title_activity_activity_deal_creation"
android:parentActivityName=".activities.DealSelectionActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="de.coding.mb.konstisapp.activities.DealSelectionActivity"/>
</activity>
<activity android:name=".activities.DealView"
android:label="@string/title_activity_deal_view"
android:parentActivityName=".activities.DealSelectionActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="de.coding.mb.konstisapp.activities.DealSelectionActivity">
</meta-data>
</activity>
</manifest>
从片段内部,您不能只使用
startActivity()
您必须使用
getActivity().startActivity(in)
\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=新的Intent(getActivity(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
getActivity().startActivity(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}
另请参见从片段内部,您不能仅使用
startActivity()
您必须使用
getActivity().startActivity(in)
\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=新的Intent(getActivity(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
getActivity().startActivity(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}
另请参见更改的代码
_dealList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
Intent in = new Intent(v.getContext(), DealView.class);
in.putExtra("deal", position);
in.putExtra("city", _citySearchBar.getText());
startActivity(in);
Log.d("BASE_FRAGMENT", "Activity should have been started here");
}
});
}
\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=newintent(v.getContext(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
星触觉(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}
更改代码
_dealList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
Intent in = new Intent(v.getContext(), DealView.class);
in.putExtra("deal", position);
in.putExtra("city", _citySearchBar.getText());
startActivity(in);
Log.d("BASE_FRAGMENT", "Activity should have been started here");
}
});
}
\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=newintent(v.getContext(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
星触觉(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}
在intent.setFlags(…)方法中使用FLAG\u ACTIVITY\u NEW\u任务
\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=newintent(v.getContext(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
in.setFlag(Acitvity.FLAG\u活动\u新任务);
getActivity().startActivity(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}
在intent.setFlags(…)方法中使用FLAG\u ACTIVITY\u NEW\u任务
\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Intent in=newintent(v.getContext(),DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
in.setFlag(Acitvity.FLAG\u活动\u新任务);
getActivity().startActivity(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}
由于从片段中启动新活动不起作用,您可以尝试将代码迁移到宿主活动。一种干净且可重用的方法是在新文件中创建接口
public interface myInterface {
public void startMyIntent(Intent i);
}
然后,在活动类中实现这个接口,托管您的片段
public class hostingActivity extends AppCompatActivity implements myInterface {
@Override
public void startMyIntent(Intent i) {
startActivity(i);
}
}
在片段的侦听器中,可以这样调用它
_dealList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
Activity parentActivity = getActivity();
Intent in = new Intent(parentActivity, DealView.class);
in.putExtra("deal", position);
in.putExtra("city", _citySearchBar.getText());
((myInterface)parentActivity).startMyIntent(in);
Log.d("BASE_FRAGMENT", "Activity should have been started here");
}
});
}
\u dealList.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Activity parentActivity=getActivity();
Intent in=新的Intent(父活动,DealView.class);
in.putExtra(“交易”,位置);
在.putExtra(“city”,_citysearch.getText())中;
((myInterface)parentActivity).startMyContent(in);
Log.d(“BASE_片段”,“活动应该在这里开始”);
}
});
}
由于从片段中启动新活动不起作用,您可以尝试将代码迁移到宿主活动。一种干净且可重用的方法是在新文件中创建接口
public interface myInterface {
public void startMyIntent(Intent i);
}
然后,实现这个接口
_dealList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
Activity parentActivity = getActivity();
Intent in = new Intent(parentActivity, DealView.class);
in.putExtra("deal", position);
in.putExtra("city", _citySearchBar.getText());
((myInterface)parentActivity).startMyIntent(in);
Log.d("BASE_FRAGMENT", "Activity should have been started here");
}
});
}