将片段添加到Android

时间:2017-09-01 14:51:53

标签: java android fragment

我正在尝试一件非常简单的事情。通过java代码添加片段。但它在(fragmentTransaction.add(R.id.fragment_container,fragment);)中显示错误。我无法理解这里有什么问题。请帮忙。主类和片段类有两个类。和两个布局主要布局和片段布局。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.chetan.fragmentprtc.MainActivity">


<fragment
    android:id="@+id/fragment_container"
    android:name="android.app.DialogFragment"
    android:layout_width="368dp"
    android:layout_height="495dp"
    tools:layout_editor_absoluteX="8dp"
    tools:layout_editor_absoluteY="8dp" />

</android.support.constraint.ConstraintLayout>


package com.example.chetan.fragmentprtc;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = 
fragmentManager.beginTransaction();
    BlankFragment fragment = new BlankFragment();
    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
}
}




<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"
tools:context="com.example.chetan.fragmentprtc.BlankFragment">

<!-- TODO: Update blank fragment layout -->
<TextView
    android:id="@+id/fragment1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/hello_blank_fragment" />

</FrameLayout>

package com.example.chetan.fragmentprtc;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class BlankFragment extends Fragment {


public BlankFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
  View view = inflater.inflate(R.layout.fragment_blank,container,false);
    return view;

}

}

3 个答案:

答案 0 :(得分:1)

我不知道为什么上面的代码对我不起作用。但是这样做了:

 BlankFragment firstFragment = new BlankFragment();
 getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container, firstFragment).commit();

这没有显示任何错误,它确实有效!谢谢大家。

答案 1 :(得分:0)

抬头!!

处理片段时的一个重要规则是您的activity布局必须包含一个容器视图,您可以在其中插入片段。

Container可以是ViewGroup,例如FrameLayoutLinearLayout。在你的情况下,你正在替换Fragment中的一个片段 - 那就是出错的地方。

使用以下代码作为容器 -

<FrameLayout
    android:id="@+id/fragment_container"
    ....
    ... />

答案 2 :(得分:0)

首先你必须记住一件事: 无法替换以XML格式编码的片段。 并且您的代码似乎存在多个问题。第一件事是MainActivity的布局和另一件事,根据您的需要,您需要替换而不是添加片段。好吧,我以简单的方式将您的代码重构为:

<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="com.example.chetan.fragmentprtc.BlankFragment">

<TextView
android:id="@+id/fragment1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/hello_blank_fragment" />

 </LinearLayout>

您的MainActivity代码:

class SomeClass extends ObjectModel
{ 
  public static $definition = array(
    'table' => 'roja45_productrental_rental',
    'primary' => 'id_roja45_product_rental',
    'multilang' => false,
    'fields' => array(
        'id_customer' => array('type' => self::TYPE_INT),
    ),
  );

  public $id_customer;

  public static function getInstance() {
    $instance = new SomeClass();
    return $instance
  }
}

子片段的布局为:

$reflection = new ReflectionClass($class);

if (!$reflection->hasProperty('definition')) {
    return false;
}

希望在重构这么多之后它会起作用。