gpt4 book ai didi

android - 为什么在选择抽屉导航 android 菜单选项时不显示所需的 fragment ?

转载 作者:行者123 更新时间:2023-11-29 23:37:30 25 4
gpt4 key购买 nike

在我看来,程序中有两个 fragment ,每个 fragment 负责一种消息 - 进入或继续。

有一个适配器实现了对这些 fragment 的选择。我想确保在选择菜单项时,我看到了某个 fragment ,这是我的主类菜单:

public class MessageCenter extends AppCompatActivity
implements Sent.OnFragmentInteractionListener, Received.OnFragmentInteractionListener, OnNavigationItemSelectedListener {


PagerAdapter mAdapter;
FrameLayout mPager;
FragmentManager fragmentManager;
FragmentTransaction ft;
TextView txt1, txt2;
SharedPreferences sp;
SharedPreferences.Editor editor;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message_center);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);


FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MessageCenter.this, WriteResponseMess.class);
startActivity(intent);
}
});

txt1 = findViewById(R.id.id_app);
txt2 = findViewById(R.id.name_app);

DrawerLayout drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();

NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);

/*mAdapter = new PagerAdapter(getSupportFragmentManager());
mPager = findViewById(R.id.frame);*/


navigationView.getMenu().findItem(R.id.received).setChecked(true);
fragmentManager = getSupportFragmentManager();
ft = fragmentManager.beginTransaction();
ft.replace(R.id.frame, new Received());
ft.commit();

getPersonalData();
}

@Override
public void onBackPressed() {
DrawerLayout drawer = findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
Intent intent = new Intent(MessageCenter.this, MainScreen.class);
startActivity(intent);
super.onBackPressed();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.home_menu, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();

if (id == R.id.home) {
Intent intent = new Intent(getApplicationContext(), MainScreen.class);
startActivity(intent);
}

return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {


int id = item.getItemId();
Fragment fragment = null;

if (id == R.id.received) {
fragmentManager = getSupportFragmentManager();
ft = fragmentManager.beginTransaction();
ft.replace(R.id.frame, new Received());
ft.commit();
} else if (id == R.id.sended) {
fragmentManager = getSupportFragmentManager();
ft = fragmentManager.beginTransaction();
ft.replace(R.id.frame, new Sent());
ft.commit();
}


DrawerLayout drawer = findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}

@Override
public void onFragmentInteraction(Uri uri) {

}

@Override
public void onPointerCaptureChanged(boolean hasCapture) {

}

}

但是,我只有一个 fragment - 传入消息,但传出消息不显示我。也许我在某处没有完成某些事情,或者某处有错误。

任何帮助都会非常有用。谢谢。

更新

我的已发送 fragment :

public class Sent extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

private OnFragmentInteractionListener mListener;
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;

ArrayList<Message> messageArrayList;
SwipeRefreshLayout mSwipeRefreshLayout;

private boolean isVisible;
private boolean isStarted;


SharedPreferences sp;
private Context context;

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_sent, container, false);
recyclerView = rootView.findViewById(R.id.list_sen);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

mSwipeRefreshLayout = rootView.findViewById(R.id.refresh_1);
mSwipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN, Color.BLUE, Color.CYAN);
mSwipeRefreshLayout.setOnRefreshListener(this);
return rootView;
}

@Override
public void onRefresh() {
sent();
}

@Override
public void onStart() {
super.onStart();
isStarted = true;
if (isVisible) {
sent();
}
}

@Override
public void onStop() {
super.onStop();
isStarted = false;
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isVisible = isVisibleToUser;
if (isVisible && isStarted) {
sent();
}
}


@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}

public void sent() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://0000/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();

adapter = null;

sp = Objects.requireNonNull(context).getSharedPreferences("access_token", 0);


String a_token = sp.getString("access_token", "");
APIService mAPIService = retrofit.create(APIService.class);
mAPIService.getInMess("Bearer " + a_token, 1, 1).enqueue(new Callback<MessageArray>() {
@Override
public void onResponse(@NonNull Call<MessageArray> call, @NonNull Response<MessageArray> response) {

if (response.isSuccessful()) {
messageArrayList = (ArrayList<Message>) Objects.requireNonNull(response.body()).getMessages();
adapter = new MessageAdapter2(messageArrayList, getActivity());
recyclerView.setAdapter(adapter);
mSwipeRefreshLayout.setRefreshing(false);


} else {
ResponseBody errorBody = response.errorBody();
try {

if (Objects.requireNonNull(errorBody).string().contains("access_token_expired")) {
updateToken();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

@Override
public void onFailure(@NonNull Call<MessageArray> call, @NonNull Throwable t) {

}
});
}

public void updateToken() {

}


public void logOut() {


}


@Override
public void onAttach(Context context) {

super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
this.context = context;
}


@Override
public void onDetach() {
super.onDetach();
mListener = null;
}


public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}

我收到的代码:

public class Received extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

private OnFragmentInteractionListener mListener;
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
ArrayList<Message> messageArrayList;
SwipeRefreshLayout mSwipeRefreshLayout;
SharedPreferences sp;

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_received, container, false);
recyclerView = rootView.findViewById(R.id.list_res);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
received();
mSwipeRefreshLayout = rootView.findViewById(R.id.refresh_2);
mSwipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN, Color.BLUE, Color.CYAN);
mSwipeRefreshLayout.setOnRefreshListener(this);
return rootView;
}

@Override
public void onRefresh() {
received();
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}

public void received() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://0000/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();

adapter = null;

sp = Objects.requireNonNull(getActivity()).getSharedPreferences("access_token", 0);
String a_token = sp.getString("access_token", "");

final APIService mAPIService = retrofit.create(APIService.class);
mAPIService.getInMess("Bearer " + a_token, 0, 1).enqueue(new Callback<MessageArray>() {

@Override
public void onResponse(@NonNull Call<MessageArray> call, @NonNull Response<MessageArray> response) {
if (response.isSuccessful()) {
messageArrayList = (ArrayList<Message>) Objects.requireNonNull(response.body()).getMessages();
adapter = new MessageAdapter(messageArrayList, getActivity());
recyclerView.setAdapter(adapter);
mSwipeRefreshLayout.setRefreshing(false);

} else {
ResponseBody errorBody = response.errorBody();
try {
if (Objects.requireNonNull(errorBody).string().contains("access_token_expired")) {
updateToken();

} else if (errorBody.string().contains("invalid_token")) {
updateToken();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

@Override
public void onFailure(@NonNull Call<MessageArray> call, @NonNull Throwable t) {


}
});
}

public void updateToken() {


}


public void logOut() {

}

@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}

@Override
public void onDetach() {
super.onDetach();
mListener = null;
}


public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}

最佳答案

解决方案:

首先声明两个全局类:

public Class fragmentClass;
public Fragment fragment; // v4.Fragment not the app.Fragment

其次,

fragmentClass = VendorDriverFragment.class;
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit();

所以,根据上面的策略,修改如下:

    int id = item.getItemId();

if (id == R.id.received) {

fragmentClass = Recieved.class;
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit();

}
else if (id == R.id.sended) {

fragmentClass = Sent.class;
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit();
}

不要忘记将这两个类声明为公共(public)类。

这对我有用,试试吧,如果有任何问题,请评论。

关于android - 为什么在选择抽屉导航 android 菜单选项时不显示所需的 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52115783/

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