Android片段活动布局未使用findViewById在多窗格布局中查找视图

时间:2013-01-24 14:59:01

标签: android android-layout android-fragmentactivity

findViewById(R.id.team_detail_container)无法找到该视图。我的问题是xml还是我构建FragmentActivity的方式?我该如何解决这个问题?

为了支持片段活动的构造函数中片段的自定义列表,我已经替换了

setContentView(R.layout.activity_team_list);

frag=(TeamListFragment)getSupportFragmentManager().findFragmentById(android.R.id.content);
        if (frag==null) {
            frag=new TeamListFragment();
            getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit();

所以我的班级现在看起来像这样

public class TeamListActivity extends SherlockFragmentActivity implements
        TeamListFragment.Callbacks {

    private boolean mTwoPane;
    private TeamListFragment frag=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        frag=(TeamListFragment)getSupportFragmentManager().findFragmentById(android.R.id.content);
        if (frag==null) {
            frag=new TeamListFragment();
            getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit();
        }
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        if (findViewById(R.id.team_detail_container) != null) {

            Log.i("@@@@", "Team Detail Container has been found! Yaay!");
            mTwoPane = true;
            ((TeamListFragment) getSupportFragmentManager().findFragmentById(
                    R.id.team_list)).setActivateOnItemClick(true);
        }   
    }

尽管team_detail_container存在于使用的xml文件中,但从未遇到if (findViewById(R.id.team_detail_container) != null) {条件

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/team_list_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:orientation="horizontal"
        android:showDividers="middle"
        tools:context=".TeamListActivity" >

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/team_list"
                android:orientation="vertical"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:paddingLeft="8dp"
                android:paddingRight="8dp">

            <ListView
                android:id="@android:id/list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:drawSelectorOnTop="false" />

            <TextView android:id="@id/android:empty"
                      android:layout_width="match_parent"
                      android:layout_height="match_parent"
                      android:text="No data"/>
         </LinearLayout>        
        <View
            android:layout_width="fill_parent"
            android:layout_height="1dp"
            android:background="?android:attr/listDivider"
        /> 

        <FrameLayout
            android:id="@+id/team_detail_container"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="3" />

    </LinearLayout>

我知道正在使用这个特定的布局xml,因为我对xml文件所做的更改会反映在应用程序中。 我也知道条件永远不会满足,因为我从来没有得到日志消息Log.i("@@@@", "Team Detail Container has been found! Yaay!");,行为get是当选择一个项目时,列表视图被替换为细节片段而不是旁边显示的细节片段列表视图,因为未满足项目选定的条件

@Override
public void onItemSelected(int id) {
    if (mTwoPane) {
                // mTwoPane is never set! Why?

        Bundle arguments = new Bundle();
        arguments.putInt(TeamDetailFragment.ARG_ITEM_ID, id);
        TeamDetailFragment fragment = new TeamDetailFragment();
        fragment.setArguments(arguments);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.team_detail_container, fragment).commit();

    } else {
        // In single-pane mode, simply start the detail activity
        // for the selected item ID.
        Intent detailIntent = new Intent(this, TeamDetailSwipeActivity.class);
        detailIntent.putExtra(TeamDetailFragment.ARG_ITEM_ID, id);
        startActivity(detailIntent);
    }
}

2 个答案:

答案 0 :(得分:1)

我认为问题是你正在寻找活动中的片段,但由于你没有使用setContentView,因此活动实际上没有查看的视图。尝试使用getView()方法从片段中获取视图。

答案 1 :(得分:1)

在提交事务后,片段不会立即添加到布局树中。你必须等到片段被调用onViewCreated。您可以在onStart - Activity的方法中访问视图,但将该逻辑保留在片段本身中可能更好。活动不应该关注片段中包含的视图。