gpt4 book ai didi

android - 找不到 fragment ID 的 View

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:58 26 4
gpt4 key购买 nike

我一整天都被困在这个问题上,我似乎无法在这里找到适合我的情况的答案,足以让我投入使用。

看看我的 UI,选项卡和 ListView 功能很好:/image/84kRY.png

当我单击一个列表项时,例如 Blue,我希望它在纵向模式下显示一个新的 fragment 作为蓝屏,而在横向模式下它在一半屏幕上显示该 fragment ,在另一半屏幕上显示 ListView 。我正在使用 ActionBarSherlock 和 fragment 来完成此任务。

我从内到外构建了它,所以我从一个列表开始,它按照我想要的方式工作。然后我添加了选项卡、寻呼机功能和其他列表。在那个过程中的某个地方, fragment 显示停止工作,每次我点击任何东西我都会崩溃。

这是我的一个 ListView Activity 的点击部分

public class TitlesFragment extends SherlockListFragment{

boolean mDualPane;
int mCurCheckPosition = 0;

.
.
.

@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);
}

@Override
public void onListItemClick(ListView l, View v, int position, long id){
showDetails(position);
}

void showDetails(int position){
SherlockFragment newContent = new SherlockFragment();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();


if(mDualPane){
switch(position){
case 0:
newContent = new Blue();
break;
case 1:
newContent = new Red();
break;
case 2:
newContent = new Green();
break;
case 3:
newContent = new Yellow();
break;
case 4:
newContent = new Purple();
break;


} ft.replace(R.id.details, newContent);
} else {
switch(position){
case 0:
newContent = new Blue();
break;
case 1:
newContent = new Red();
break;
case 2:
newContent = new Green();
break;
case 3:
newContent = new Yellow();
break;
case 4:
newContent = new Purple();
break;


}ft.replace(R.id.titles, newContent);
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
return;
}
}

这是蓝色类

public class Blue extends SherlockFragment{

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

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
return inflater.inflate(R.layout.blue, container, false);
}

}

蓝色布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/blue"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0000FF"
android:orientation="vertical" >

</LinearLayout>

我希望它在横向中替换的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="horizontal"
android:id="@+id/fragment_layout_support_land" >

<fragment
android:id="@+id/titles_land"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="1"
class="***.TitlesFragment" />

<fragment
android:id="@+id/details"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="2" />

</LinearLayout>

以及纵向替换的布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_layout_support"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<fragment
android:id="@+id/titles"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="***.TitlesFragment" />

</FrameLayout>

最后是我的 LogCat

LogCat Screenshot Here

我之前使用教程来了解 fragment 的工作原理。我无法发布更多链接,但您可以在名为 ListFragment Tutorial Part 2 的 youtube 上找到它。

在这一点上,我对任何事情都持开放态度,包括从头开始和以不同的方式编写代码,但我更愿意了解这里发生的事情以及原因,以便我可以从中学习。谢谢!

编辑尝试了一些新的东西并得到了一个新的错误

@Override
public void onListItemClick(ListView l, View v, int position, long id){
showDetails(position);
}

void showDetails(int position){
SherlockFragment newContent = new SherlockFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.fragment_layout_support, newContent);
transaction.commit();


if(mDualPane){
switch(position){
case 0:
newContent = new Blue();
break;
case 1:
newContent = new Red();
break;
case 2:
newContent = new Green();
break;
case 3:
newContent = new Yellow();
break;
case 4:
newContent = new Purple();
break;


} transaction.add(R.id.fragment_layout_support_land, newContent);
} else {
switch(position){
case 0:
newContent = new Blue();
break;
case 1:
newContent = new Red();
break;
case 2:
newContent = new Green();
break;
case 3:
newContent = new Yellow();
break;
case 4:
newContent = new Purple();
break;


}transaction.replace(R.id.fragment_layout_support, newContent);
}
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
transaction.addToBackStack(null);
transaction.commit();
return;
}
}

新的 LogCat

    FATAL EXCEPTION: main java.lang.IllegalStateException: commit already called
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:582)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
at [package].TitlesFragment.showDetails(TitlesFragment.java:97)
at [package].TitlesFragment.onListItemClick(TitlesFragment.java:44)
at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:58)
at android.widget.AdapterView.performItemClick(AdapterView.java:298)
at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2788)
at android.widget.AbsListView$1.run(AbsListView.java:3463)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

最佳答案

您应该将肖像 xml 更改为:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_layout_support"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<FrameLayout
android:id="@+id/titles"
android:layout_width="0px"
android:layout_height="match_parent"
android:layout_weight="1" />

</FrameLayout>

然后在您的 MainActivityonCreate 方法中,输入:

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

setContentView(R.layout.main);

TitlesFragment title = new TitlesFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.titles, title).commit();
}

另外请改回TitlesFragment中的代码查看下面我的showDetails

注意 :对于Landscape,希望你自己搞定。您目前处理 land-portrait 的方式,IMO 不是最好的方式。阅读Layout Aliases了解更多详情。

Extra :您不必创建 BlueGreenRedYellow 类。您可以创建一个 Rainbow 类。

public class Rainbow extends SherlockFragment {

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

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

// default color
int color = Color.WHITE;

// get the color if provided through setArguments(Bundle args)
if (getArguments() != null) {
color = getArguments().getInt("color");
}

view.findViewById(R.id.rainbow).setBackgroundColor(color);

return view;
}
}

将您的 showDetails 更改为:

 void showDetails(int position) {
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

int color;
switch (position) {
case 0:
color = Color.BLUE;
break;
case 1:
color = Color.RED;
break;
default:
color = Color.WHITE;
}

Rainbow rainbow = new Rainbow();
Bundle arguments = new Bundle();
arguments.putInt("color", color);
rainbow.setArguments(arguments);

ft.replace(R.id.titles, rainbow);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
return;
}

关于android - 找不到 fragment ID 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18819187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com