Как убрать черный экран, который появляется между действиями при загрузке данных с внешнего сервера или API? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть две активности, первое действие - экран Spla sh, который исчезает через 4 с, перед тем как появится второе действие, черный экран появляется на несколько секунд. Я использую https://newsapi.org/ для загрузки данных во второе действие. Поскольку загрузка данных занимает так много времени, пока запрос не возвращается с сервера, черный экран остается спереди, и как только у меня есть данные, заполняется второе действие с пользовательским интерфейсом.

Я использую AsyncTask для этой загрузки данных в фоновом режиме. Но все еще сталкиваюсь с проблемой черного экрана, я не хочу, чтобы этот черный экран появлялся при переключении между виды деятельности. Я попытался использовать индикатор выполнения как в onCreate деятельности, связанной с фрагментом, так и во фрагменте, но черный экран все еще появляется.

Spla sh Экран появляется в течение 4 с

Черный экран между двумя действиями

Второе действие после данных загружено

SPLA SH КОД ДЕЯТЕЛЬНОСТИ

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ImageView imageView = findViewById(R.id.imageView);
    imageView.animate().rotationBy(720).setDuration(3000);
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent i = new Intent(MainActivity.this, homepage.class );
            startActivity(i);
            finish();
        }
    },4000);

}

}

ФРАГМЕНТ

public class FragmentRecentNews extends Fragment {
View view;
private List<RecentNews> recentNewsList;
NewsRepo newsRepo;
public FragmentRecentNews() {
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    //recentNews
    newsRepo= new NewsRepo();
    recentNewsList = newsRepo.GetTopHeadlines("https://newsapi.org/v2/top-headlines?country=au&apiKey=b4fcfc3bfc9c4a8380a83a02b3d0cfc7");
    view = inflater.inflate(R.layout.recentnews_fragment,container,false);
    RecyclerView recyclerView = view.findViewById(R.id.recyclerViewid);
    RecycleViewAdapter adapter = new RecycleViewAdapter(getActivity(),recentNewsList);
    recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 1));
    recyclerView.setAdapter(adapter);
    return view;
}

}

ВТОРАЯ ДЕЯТЕЛЬНОСТЬ

public class homepage extends AppCompatActivity {
private TabLayout tabLayout;
private ViewPager viewPager;
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mToggle;
private List<RecentNews> recentNewsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_homepage);
   //settanlayout
    tabLayout = findViewById(R.id.tablayoutid);
    viewPager = findViewById(R.id.viewpagerid);
    ViewPageAdapter viewPageAdapter = new ViewPageAdapter(getSupportFragmentManager());
    viewPageAdapter.AddFragment(new FragmentRecentNews(),"Recent News");
    viewPageAdapter.AddFragment(new FragmentNewsSources(),"Sources");
    viewPageAdapter.AddFragment(new FragmentCountries(),"Countries");
    viewPager.setAdapter(viewPageAdapter);
    tabLayout.setupWithViewPager(viewPager);
    //Drawer naviagtion
    mDrawerLayout = findViewById(R.id.drwaerlayoutid);
    mToggle = new ActionBarDrawerToggle(this,mDrawerLayout,R.string.open,R.string.close);
    mDrawerLayout.addDrawerListener(mToggle);
    mToggle.syncState();
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if (mToggle.onOptionsItemSelected(item)){
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}

RECYCLERVIEWADAPTER

public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.MyViewHolder>

{

private FragmentActivity mContext;
private List<RecentNews> mData;
private  Context context;
public RecycleViewAdapter(FragmentActivity mContext, List<RecentNews> mData) {
    this.mContext = mContext;
    this.mData = mData;
}

}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view;
    LayoutInflater mInflater = LayoutInflater.from(mContext);
    view= mInflater.inflate(R.layout.card_recentnews,parent,false);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {

    holder.title.setText(mData.get(position).getTitle());
    holder.source.setText(mData.get(position).getSourceName());
   // holder.author.setText(mData.get(position).getAuthor());
    holder.date.setText(mData.get(position).getPublishedAt());
    //holder.image.setImageResource(mData.get(position).getUrlToImage());
    Picasso.with(mContext).load(mData.get(position).getUrlToImage()).into(holder.image);
    holder.image.setClipToOutline(true);
    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fragmentManager = mContext.getSupportFragmentManager();
            Intent intent = new Intent(mContext, newsdetails.class);
            mContext.startActivity(intent);
        }
    });


}

@Override
public int getItemCount() {
    return mData.size();
}

public static class MyViewHolder extends RecyclerView.ViewHolder{

    TextView title;
    TextView source;
   // TextView author;
    TextView date;
    ImageView image;
    Button button;

    public MyViewHolder(@NonNull View itemView)
    {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.titletextview);
        source = itemView.findViewById(R.id.sourcetextview);
       // author = itemView.findViewById(R.id.authortextview);
        date = itemView.findViewById(R.id.datetextview);
        image = itemView.findViewById(R.id.newsimageview);
        button = itemView.findViewById(R.id.detailsbtn);
    }
}

}

Макет главной страницы

<androidx.drawerlayout.widget.DrawerLayout android:layout_height="match_parent"
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drwaerlayoutid"
    >
<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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".homepage">
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="200dp">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:scaleType="centerCrop"
        android:src="@drawable/bg"
        android:background="@color/colorPrimary">
    </ImageView>
    <ImageView
        android:id="@+id/icon"
        android:layout_width="92dp"
        android:layout_height="73dp"
        android:layout_alignParentTop="true"
        android:layout_centerInParent="true"
        android:src="@drawable/logon"></ImageView>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="@string/appdesc"
        android:textColor="#ffff"
        android:layout_below="@+id/heading"
        android:paddingTop="0dp"
        android:textSize="18dp"
        />
    <TextView
        android:layout_below="@+id/icon"
        android:id="@+id/heading"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-black"
        android:gravity="center"
        android:text="Awais World News"
        android:textColor="#ffffff"
        android:textSize="30dp"
        android:textStyle="bold">
    </TextView>
</RelativeLayout>
    <com.google.android.material.tabs.TabLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        app:tabGravity="fill"
        app:tabMode="fixed"
        android:id="@+id/tablayoutid"
        android:background="@color/colorPrimaryDark"
        app:tabTextColor="#fff"
        app:tabIndicatorColor="#FFB300"
        app:tabIndicatorHeight="4dp"

        />
    <androidx.viewpager.widget.ViewPager
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/viewpagerid"/>
</LinearLayout>
    <com.google.android.material.navigation.NavigationView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        app:menu="@menu/menu"
        android:layout_gravity="start">
    </com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>

Стили. XML

    <resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

1 Ответ

0 голосов
/ 08 апреля 2020

Похоже, ваш сетевой вызов перед просмотром создан в FragmentRecentNews. Пожалуйста, попробуйте выполнить следующие шаги: 1. onCreateView должен содержать только шаги создания пользовательского интерфейса, например

view = inflater.inflate(R.layout.recentnews_fragment,container,false);
return view
создать переопределить метод onViewCreated для фрагмента и вставить туда свой код вызова API

Вы видите черный экран, потому что onCreateView выполняет много работы, а фрагмент не может быть нарисован.

public class FragmentRecentNews extends Fragment {
    View view;
    private List<RecentNews> recentNewsList;
    NewsRepo newsRepo;
    public FragmentRecentNews() {
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.recentnews_fragment,container,false);
        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        newsRepo= new NewsRepo();
        recentNewsList = newsRepo.GetTopHeadlines("https://newsapi.org/v2/top-headlines?country=au&apiKey=b4fcfc3bfc9c4a8380a83a02b3d0cfc7");
        RecyclerView recyclerView = view.findViewById(R.id.recyclerViewid);
        RecycleViewAdapter adapter = new RecycleViewAdapter(getActivity(),recentNewsList);
        recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 1));
        recyclerView.setAdapter(adapter);
    }
}
...