Java 如何添加片段以使我的应用程序不';不要在屏幕上显示空白

Java 如何添加片段以使我的应用程序不';不要在屏幕上显示空白,java,android,android-layout,android-studio,android-fragments,Java,Android,Android Layout,Android Studio,Android Fragments,我正在制作Udacity Sunshine应用程序。以前使用的android studio版本是0.5.8,现在我使用的是android studio 3.0.1。因此,在这两种方法中使用的编码技术之间存在着很大的差距。 所以,在这里,我在empty activity中使用了fragment,我通过阅读developer.android.com关于该片段的文章实现了它,我得到了关于它的抽象概念,但大部分内容还不清楚。 所以我添加了片段,并在列表视图中添加了假数据来填充它。 但当我在我的设备上运行

我正在制作Udacity Sunshine应用程序。以前使用的android studio版本是0.5.8,现在我使用的是android studio 3.0.1。因此,在这两种方法中使用的编码技术之间存在着很大的差距。 所以,在这里,我在empty activity中使用了fragment,我通过阅读developer.android.com关于该片段的文章实现了它,我得到了关于它的抽象概念,但大部分内容还不清楚。 所以我添加了片段,并在列表视图中添加了假数据来填充它。 但当我在我的设备上运行该应用程序时,它仍然显示一个空白屏幕,并且没有我在代码中添加的文本视图:

布局/活动\u main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
tools:ignore="MergeRootFrame" />
package/ArticleFragment.java

import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;

    public class ArticleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    // Create some dummy data for the ListView.  Here's a sample weekly forecast
    String[] data = {
            "Mon 6/23 - Sunny - 31/17",
            "Tue 6/24 - Foggy - 21/8",
            "Wed 6/25 - Cloudy - 22/17",
            "Thurs 6/26 - Rainy - 18/11",
            "Fri 6/27 - Foggy - 21/10",
            "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
            "Sun 6/29 - Sunny - 20/7"
    };
    List<String> weekForecast = new ArrayList<String>(Arrays.asList(data));

    // Now that we have some dummy forecast data, create an ArrayAdapter.
    // The ArrayAdapter will take data from a source (like our dummy forecast) and
    // use it to populate the ListView it's attached to.
    ArrayAdapter<String> mForecastAdapter =
            new ArrayAdapter<String>(
                    getActivity(), // The current context (this activity)
                    R.layout.list_item_forecast, // The name of the layout ID.
                    R.id.list_item_forecast_textview, // The ID of the textview to populate.
                    weekForecast);
    View rootView = inflater.inflate(R.layout.fragment_layout, container, false);

    // Get a reference to the ListView, and attach this adapter to it.
    ListView listview = (ListView) rootView.findViewById(
            R.id.listview_forecast);
    listview.setAdapter(mForecastAdapter);
    // Inflate the layout for this fragment
    return rootView;
}
}
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公共类ArticleFragment扩展了片段{
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为ListView创建一些虚拟数据
字符串[]数据={
“周一6/23 - 阳光明媚-2017年11月31日“,
“6月24日星期二-大雾-21月8日”,
“6月25日星期三-多云-17月22日”,
“6月26日星期四-雨季-11月18日”,
“6月27日星期五-大雾-10月21日”,
“Sat 6/28-被困在气象站-23/18”,
“太阳6/29-晴朗-20/7”
};
List-weekForecast=newarraylist(Arrays.asList(data));
//现在我们有了一些虚拟预测数据,创建一个ArrayAdapter。
//ArrayAdapter将从源(如我们的虚拟预测)获取数据,然后
//使用它填充它附加到的ListView。
阵列适配器mForecastAdapter=
新阵列适配器(
getActivity(),//当前上下文(此活动)
R.layout.list\u item\u forecast,//布局ID的名称。
R.id.list\u item\u forecast\u textview,//要填充的textview的id。
周预测);
视图根视图=充气机。充气(R.layout.fragment\u布局,容器,false);
//获取对ListView的引用,并将此适配器连接到它。
ListView ListView=(ListView)rootView.findViewById(
R.id.listview\u预测);
setAdapter(mForecastAdapter);
//为该碎片膨胀布局
返回rootView;
}
}

您应该浏览以下链接:

您没有设置新活动的内容视图。您可能正在推动StaticFragment活动,但您没有加载视图的xml。在yourActivity的super.onCreate()之后,添加setContentView(R.layout.your_fragment.xml)


应该解决这个问题。您应该浏览以下链接:

您没有设置新活动的内容视图。您可能正在推动StaticFragment活动,但您没有加载视图的xml。在yourActivity的super.onCreate()之后,添加setContentView(R.layout.your_fragment.xml)


应该可以解决这个问题。我在这里看到两个可能的问题。首先,您应该有另一个布局,可能是
LinearLayout
作为
activity\u main.xml
文件中的根视图,如下所示:

<LinearLayout 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:id="@+id/my_linear_layout_root"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        tools:ignore="MergeRootFrame" />
</LinearLayout>

我还没有看到framelayout用作活动的根视图和片段容器,这就是我可能出错的原因,但我通常会这样将片段添加到容器中。

我在这里看到两个可能的问题。首先,您应该有另一个布局,可能是
LinearLayout
作为
activity\u main.xml
文件中的根视图,如下所示:

<LinearLayout 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:id="@+id/my_linear_layout_root"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        tools:ignore="MergeRootFrame" />
</LinearLayout>

我还没有看到framelayout用作活动的根视图和片段容器,这就是我可能出错的原因,但我通常会这样将片段添加到容器中。

代码的问题是您没有实例化您创建的片段类。您需要实例化它并将其传递给
FragmentManager
,还需要更改主活动中的
setContentView(R.layout.fragment\u layout)

只要将
MainActivity.java
类更改为该类,您的问题就解决了。无需更改布局文件

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, new ArticleFragment())
                .commit();
    }
}

代码的问题在于没有实例化所创建的片段类。您需要实例化它并将其传递给
FragmentManager
,还需要更改主活动中的
setContentView(R.layout.fragment\u layout)

只要将
MainActivity.java
类更改为该类,您的问题就解决了。无需更改布局文件

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, new ArticleFragment())
                .commit();
    }
}

他显然已经这样做了,请正确阅读他的代码他显然已经这样做了,请正确阅读他的代码没有必要添加根线性布局。没有必要。好吧,我不确定我是否应该修改答案。没有必要添加根线性布局。没有必要。好吧,我不确定我是否应该修改答案。我已经做了,现在它显示了我添加的项目列表。但现在应用程序操作栏是missing@ShashankeshUpadhyay请参阅更新的答案。从AppCompatActivity扩展您的活动。因为AppCompatActivity已经从FragmentActivity扩展而来。我已经完成了,现在它显示了我添加的项目列表。但现在应用程序操作栏是missing@ShashankeshUpadhyay请参阅更新的答案。从AppCompatActivity扩展您的活动。因为AppCompatActivity已经从FragmentActivity扩展。
public class MainActivity extends FragmentActivity {

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

        // Don't leave all this in your onCreate, try refactor
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        ArticleFragment fragment = new ArticleFragment();
        fragmentTransaction.add(R.id.container, fragment);
        fragmentTransaction.commit();
     }
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, new ArticleFragment())
                .commit();
    }
}