Android - 你能解释为什么你可以删除代码吗?

时间:2015-09-08 14:27:57

标签: java android android-fragments

我正在使用在线视频诅咒Android。

我有一个项目列表,当我点击列表项时,会打开一个新活动来显示该项目的详细信息。问题是我得到了一个关于详细活动的双重文本,我尝试修复它,并且我发现如果我删除了DetailsActivity上的代码#onCreate()

if (savedInstanceState == null) {
   getSupportFragmentManager().beginTransaction()
      .add(R.id.details_fragment, new DetailsActivityFragment())
          .commit();
}

细节活动显示正常。

以下是DetailsActivity的照片和代码(使用不同类中的片段)

主要活动

main activity

详情活动

Details Activity

但是,如果我在DetailsActivity#onCreate()上注释掉我在下面提到的代码部分,那么详细活动看起来很好:

注释掉代码后

after comment out the code

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>

1 个答案:

答案 0 :(得分:1)

您可以看到它在此处使用了<fragment>标记

使用<fragment>标记,在创建布局时会自动附加片段。即它几乎就像下面的代码会自动为你运行

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.details_fragment, new DetailsActivityFragment())
                    .commit();
        }

因此,如果您自己运行代码,就像创建另一个片段并将其放在同一位置。这应该是你看到这种奇怪行为的原因。

修改 通常,我们使用以下两种方式之一处理片段

  1. <fragment>标记中定义,不要使用FragmentManager来管理它 在代码之后。
  2. 我们声明一个容器,通常是一个空的<FrameLayout>,我们像上面的代码一样使用FragmentManager在代码中管理它。
  3. P.S。当然还有其他情况你使用ViewPager等,但稍后你会在需要时知道。

    参考:

    使用<fragment>标记 http://developer.android.com/training/basics/fragments/creating.html

    使用容器 http://developer.android.com/training/basics/fragments/fragment-ui.html