我正在尝试一件非常简单的事情。通过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;
}
}
答案 0 :(得分:1)
我不知道为什么上面的代码对我不起作用。但是这样做了:
BlankFragment firstFragment = new BlankFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment).commit();
这没有显示任何错误,它确实有效!谢谢大家。
答案 1 :(得分:0)
抬头!!
处理片段时的一个重要规则是您的activity
布局必须包含一个容器视图,您可以在其中插入片段。
Container可以是ViewGroup,例如FrameLayout
或LinearLayout
。在你的情况下,你正在替换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;
}
希望在重构这么多之后它会起作用。