2015-09-08 168 views
0

我正在處理關於Android的在線視頻詛咒。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(主)

<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

你能證明你的佈局activity_details.xml? –

+0

當然我會馬上更新我的帖子! – Universe

+0

@DerekFung我更新了我的文章,感謝您的關注 – Universe

回答

1

你可以看到它使用了<fragment>標籤這裏

隨着<fragment>標籤,片段連接自動創建佈局時。即它幾乎像下面的代碼會自動運行您

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

所以,如果你自己運行的代碼,它會像創建另一個片段,並把它在同一地點。這應該是爲什麼你看到這種奇怪的行爲。

編輯: 一般情況下,我們處理的片段在後續的一個2路

  1. <fragment>標籤定義,並且不使用FragmentManager事後管理它的代碼 。
  2. 我們聲明一個容器,通常是一個空的<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

+0

非常感謝!你非常有幫助! – Universe

+0

歡迎:) –

+0

最後一個問題:所以在我的佈局中,我創建了兩個片段,這就是爲什麼我會在細節活動中獲得兩個文本? – Universe

相關問題