我正在使用在线视频诅咒Android。
我有一个项目列表,当我点击列表项时,会打开一个新活动来显示该项目的详细信息。问题是我得到了一个关于详细活动的双重文本,我尝试修复它,并且我发现如果我删除了DetailsActivity上的代码#onCreate()
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.details_fragment, new DetailsActivityFragment())
.commit();
}
细节活动显示正常。
以下是DetailsActivity的照片和代码(使用不同类中的片段)
主要活动
详情活动
但是,如果我在DetailsActivity#onCreate()上注释掉我在下面提到的代码部分,那么详细活动看起来很好:
注释掉代码后
DetailsActivity.java:
import android...//all the need package here don't worry about
public class DetailsActivity extends ActionBarActivity {
private Intent shareIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
//Create my Share Intent (for share options in action bar)
shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
shareIntent.putExtra(Intent.EXTRA_TEXT, "My whether data");
shareIntent.setType("text/plain");
/* IF I COMMENT THIS if CODE details showed fine. No double text */
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.details_fragment, new DetailsActivityFragment())
.commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_details, menu);
//Locate MenuItem with ShareActionProvider OR find the MenuItem that we know has the ShareActionProvider
MenuItem shareItem = menu.findItem(R.id.action_share_item);
// Fetch and Store ShareActionProvider
ShareActionProvider MyShareProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
if(MyShareProvider != null){
MyShareProvider.setShareIntent(shareIntent);
Log.d(DetailsActivity.class.getSimpleName(), "INTO share Provider--" + MyShareProvider.toString());
}
else{
Log.d(DetailsActivity.class.getSimpleName(), "NO share Provider");
}
return true;
}
....other code...
}
我已经在另一个类
中实现了这个片段public class DetailsActivityFragment extends Fragment {
public DetailsActivityFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//get the view of fragment's layout
View rootView = inflater.inflate(R.layout.fragment_details, container, false);
//get Extras form intent
Bundle DataFromIntent = getActivity().getIntent().getExtras();
//get specific data as String.
String weatherDataDetails = DataFromIntent.getString("weatherDataDetails");
//get text view from layout (rootview) and set test on it the above data (whetherData)
((TextView) rootView.findViewById(R.id.details_textview)).setText(weatherDataDetails);
return rootView;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
}
}
我的布局(主要+片段)
activity_details.xml(main)
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/details_fragment"
android:name="com.example.android.sunshine.app.DetailsActivityFragment"
tools:layout="@layout/fragment_details"
android:layout_width="match_parent"
android:layout_height="match_parent" />
和fragment_details.xml
<RelativeLayout
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"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.android.sunshine.app.DetailsActivityFragment">
<TextView
android:text="---null---"
android:id = "@+id/details_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
答案 0 :(得分:1)
您可以看到它在此处使用了<fragment>
标记
使用<fragment>
标记,在创建布局时会自动附加片段。即它几乎就像下面的代码会自动为你运行
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.details_fragment, new DetailsActivityFragment())
.commit();
}
因此,如果您自己运行代码,就像创建另一个片段并将其放在同一位置。这应该是你看到这种奇怪行为的原因。
修改强> 通常,我们使用以下两种方式之一处理片段
<fragment>
标记中定义,不要使用FragmentManager来管理它
在代码之后。<FrameLayout>
,我们像上面的代码一样使用FragmentManager在代码中管理它。P.S。当然还有其他情况你使用ViewPager等,但稍后你会在需要时知道。
参考:
使用<fragment>
标记
http://developer.android.com/training/basics/fragments/creating.html
使用容器 http://developer.android.com/training/basics/fragments/fragment-ui.html