创建新活动时无法添加片段

时间:2014-08-30 00:45:48

标签: android android-fragments

我试图创建一个向导像Android应用程序,我想创建一个活动和两个动态片段,第一个将在创建活动时添加,第二个将在用户点击按钮时添加在第一个片段中,现在我甚至无法将片段添加到活动中:

活动onCreate方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Fragment fr  = new FragmentNumber();

    getSupportFragmentManager().beginTransaction().add(fr, "number_fragment").commit();


}

这是我的活动代码,当我运行此代码时,屏幕为空白。

R.layout.activity_main是指一个空的线性布局,我不想在那里添加片段,因为我需要它们是动态的。

提前致谢。

编辑:粘贴更多文件

activity_main.xml中

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="hello from main"
    />

</FrameLayout>

MaicActivity.java

package com.example.fragmenttraining;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

公共类MainActivity扩展了ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(findViewById(android.R.id.content) != null)
    {
        Log.d("main activity", "content found");
    }

    FragmentNumber fr  = new FragmentNumber();

    //getSupportFragmentManager().beginTransaction().add(android.R.id.content, fr, "number_fragment").commit();
    getSupportFragmentManager().beginTransaction().replace(android.R.id.content, fr).commit();

}
FragmentNumber numberFragment;
FragmentFacebook facebookFragment;
public void facebookClicked(View view)
{
    numberFragment = new FragmentNumber();
    numberFragment.facebookClicked(view);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}

现在它正在工作,但片段没有被替换,它显示了activity_main的内容+ FragmentNumber片段的内容,即使id我替换它......

1 个答案:

答案 0 :(得分:1)

请按照以下步骤操作:

  1. 创建主(活动布局)文件。在其中,添加一个框架布局,作为片段的容器。
  2. 现在创建两个片段。这涉及创建两个xml文件,这些文件将在片段的 onCreateView 方法中膨胀。
  3. 您的一个片段(第一个片段)应该有一个用户可以单击的按钮。这意味着在通过id查找之后,必须在onCreateView方法中将onClick侦听器附加到它。
  4. 现在在第一个片段中创建一个接口,并在其中添加一个方法,您的活动应该在实现接口后覆盖。
  5. 当用户点击该按钮时,在onClick方法中,您应该调用interface方法来通知click事件的活动。
  6. 在活动内部,当调用方法时,创建第二个片段的新实例并通过替换第一个片段将其添加到视图中 - 或者它取决于您是否在活动中使用双窗格布局 - 在case,你只需添加片段。
  7. 请务必先检查您的片段是否存在,然后再添加一个片段进行查看。
  8. 我希望这些步骤可以帮助你。

    示例代码

    public class WizardActivity extends Activity implements SecondFragment.OnButtonClickedListener
    {
       private FirstFragment firstFragment;
    
       public void onCreate(Bundle saveInstanceState)
       {
           super.onCreate(saveInstanceState);
    
           setContentView(R.layout.main);
    
           firstFragment = new FirstFragment();
    
           setFragment(firstFragment, "firstFragment");
       }
    
    
       @Override
       public void loadSecondFragment()
       {
           SecondFragment secondFragment = new SecondFragment();
    
           setFragment(secondFragment, "secondFragment");
       }
    
       public void setFragment(Fragment frag, String tag)
       {
           FragmentManager fm = getFragmentManager();
           FragmentTransaction ft = fm.beginTransaction();
    
           Fragment fragment = getFragmentManager().findFragmentById(R.id.fragmentContainer);
           if(fragment == null)
           {
               ft.add(R.id.fragmentContainer, frag, tag);
           } else {
              ft.replace(R.id.fragmentContainer, frag, tag);
           }
    
           ft.addToBackStack(null);
           ft.commit()
    
       }
    
    }
    

    现在是主要布局的xml文件。

    <LinearLayout ........>
    
        <!--add whatever you need here-->
    
         <FrameLayout 
            android:id="@+id/fragmentContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </LinearLayout>
    

    现在让我们创建一个片段 - 第一个:

    <强> FirstFragment.java

    public class FirstFragment extends Fragment implements View.OnClickListener
    {
        private Activity mActivity;
    
        @Override
        public void onAttach(Activity act)
        {
            super.onAttach(act);
            this.mActivity = act;
    
            /*Initialize whatever you need here*/
        }
    
        @Override
        public View onCreateView(LayoutInflator inflator, ViewGroup container, Bundle saveInstanceState)
    
        {
            View v = inflator.inflate(R.layout.first_fragment, container, false);
    
            Button button = (Button)v.findViewById(R.id.button);
            button.setOnClickListener(this);
        }
    
    
        @Override
        public void onClick(View v)
        {
            ((OnButtonClickListener), mActivity).loadSecondFragment();
        }
    
        public interface OnButtonClickListener
        {
            void loadSecondFragment();
        }
    }
    

    您应该能够创建第二个片段,并在单击按钮时将其加载到活动中。

    祝你好运。