将片段添加到活动后,活动布局仍然可见

时间:2015-08-29 04:37:49

标签: android android-fragments

这是一个非常蹩脚的问题,但我真的无法弄清楚为什么会这样,所以请帮助我。

我有一个简单的活动,我在其中添加片段 动态。问题是,一旦将片段添加到活动活动布局也是可见的。为什么会这样?

MainActivity.java

public class MainActivity extends AppCompatActivity {

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

    Button btnLoad = (Button) findViewById(R.id.btn1);

    View.OnClickListener listener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            HelloFragment hello = new HelloFragment();
            fragmentTransaction.add(R.id.rootView, hello, "HELLO");
            fragmentTransaction.commit();
        }
    };

    btnLoad.setOnClickListener(listener);
} 
}

activity_main.xml中

<LinearLayout 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" tools:context=".MainActivity">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootView"
    android:orientation="vertical">
    <TextView
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/btn1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="OK"/>
</LinearLayout>
</LinearLayout>

HelloFragment.java

public class HelloFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {                       
    /** Inflating the layout for this fragment **/
    View v = inflater.inflate(R.layout.hello_fragment_layout, null);
    return v;
}
}

hello_fragment_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"      
  android:orientation="vertical" android:layout_width="match_parent"
  android:layout_height="match_parent">
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="fragment 1"/>
 </LinearLayout>

asfasfsdadgsgsagsag

After adding fragment

10 个答案:

答案 0 :(得分:1)

为片段linearLayout设置背景颜色并使其可点击

答案 1 :(得分:1)

片段只是布局中的另一个元素。将其添加到布局不会自动删除其他视图。如果您希望片段替换rootView的内容,则需要先删除rootview的子视图。类似的东西:

((LinearLayout)findViewById(R.id.rootView)).removeAllViews();

因此,您的onClick方法应如下所示:

    @Override
    public void onClick(View v) {
        ((LinearLayout)findViewById(R.id.rootView)).removeAllViews();

        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        HelloFragment hello = new HelloFragment();
        fragmentTransaction.add(R.id.rootView, hello, "HELLO");
        fragmentTransaction.commit();
    }

答案 2 :(得分:1)

约定是要使用fragmentTransaction.replace()/ add()的FrameLayout。

您的MainActivity布局文件中不应包含TextView和Button等视图。相反,将它们放在另一个片段中,并在MainActivity xml中只有一个FrameLayout。首先使用TextView / Button加载片段,然后使用新片段调用按钮单击替换。

答案 3 :(得分:1)

您的rootview作为片段和活动视图的容器。检查它并为片段单独查看。

答案 4 :(得分:1)

我知道回答这个问题的时间已经很晚了,但对于那些仍然希望在您的活动布局中执行以下操作的人来说:

<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" tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"

android:orientation="vertical">
<TextView
    android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<Button
    android:id="@+id/btn1"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="OK"/>
 </LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rootView"
android:orientation="vertical">
 </RelativeLayout>

片段布局如下:

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"      
android:orientation="vertical" android:layout_width="match_parent"
 android:background="@color/white"    <!--Add this-->
  android:layout_height="match_parent">
 <TextView
    android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<Button
    android:id="@+id/btn1"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="OK"/>
</LinearLayout>

答案 5 :(得分:0)

activity_main.xml中

<FrameLayout 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" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rootView"
android:orientation="vertical">
<TextView
    android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<Button
    android:id="@+id/btn1"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="OK"/>
</LinearLayout>

<FrameLayout 
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" >

</FrameLayout>
</FrameLayout>

MainActivity.java

   View.OnClickListener listener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        HelloFragment hello = new HelloFragment();
        fragmentTransaction.add(R.id.fragmentContainer, hello, "HELLO");
        fragmentTransaction.commit();
    }
};

答案 6 :(得分:0)

我有一个解决方案可以实现你可以做的就是为 textview 按钮创建两个片段,当你打开活动时你的显示是默认的,而另一个是你的已经创建为 HelloFragment

来自活动 onCreate()方法使用默认 textview 按钮调用第一个片段,并从该按钮的点击监听器调用 HelloFramgent

第1步:包含任何名称 MainFragment 的其他片段,其xml布局如下: -

<强> main_fragment_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"      
  android:orientation="vertical" android:layout_width="match_parent"
  android:layout_height="match_parent">
  <TextView
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/btn1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="OK"/>
 </LinearLayout>

MainFragment.java - Class

public class MainFragment extends Fragment {
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, 
  Bundle savedInstanceState) {                       
    /** Inflating the layout for this fragment **/
    View v = inflater.inflate(R.layout.main_fragment_layout, container, false);
    Button btnLoad = (Button) v.findViewById(R.id.btn1);

    View.OnClickListener listener = new View.OnClickListener() {

    @Override
    public void onClick(View view) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        HelloFragment hello = new HelloFragment();
        fragmentTransaction.add(R.id.rootView, hello, "HELLO");
        fragmentTransaction.commit();
    }
   };

   btnLoad.setOnClickListener(listener);
   return v;
 }
}

第2步:从活动 onCreate()方法

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

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    MainFragment mainFragment = new MainFragment();
    fragmentTransaction.add(R.id.rootView, mainFragment, "MAIN_FRAGMENT");
    fragmentTransaction.commit();
}

答案 7 :(得分:0)

在片段中构建用户界面(在大多数情况下,一个片段等于一个屏幕),然后使用“活动”来排列和显示这些片段。 检查一下:click here to view detailed answer

答案 8 :(得分:0)

您有两个线性布局,一个在另一个内,因此您需要执行以下步骤:

  1. 将id设置为1个线性布局rootView,并在子视图旁边。

  2. 找到您的子视图:

    View view = findViewById(R.id.child_view);
    
    view.setVisibility(View.INVISIBLE);
    
  3. 用您的片段替换rootView:

    getSupportFragmentManager().beginTransaction().add(R.id.rootview, new blankFragment())
        .addToBackStack(null).commit();
    
  4. 然后覆盖:

    @override
    public void onBackPressed() {
        android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
    
        if (fm.getBackStackEntryCount() > 0) {
            view.setVisibility(View.VISIBLE);
        }
    
        super.onBackPressed();
    }
    

答案 9 :(得分:0)

“活动”视图未针对Fragment的视图进行遮罩,因此两者均出现。一种解决方案是将片段加载到主活动布局中的框架中,该框架的高度略高(2 dp)。加载片段时,其基本立面将导致其始终覆盖活动。为片段父容器设置颜色以隐藏活动视图。

MasterActivity布局:

df['name']

“片段”布局具有背景色:

''